0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单点登录的实现方式有哪些

Linux爱好者 来源:Linux爱好者 作者:张永恒 2021-02-02 14:00 次阅读

前言

实现方式一:父域 Cookie

实现方式二:认证中心

实现方式三:LocalStorage 跨域

补充:域名分级

前言

在 B/S 系统中,登录功能通常都是基于 Cookie 来实现的。当用户登录成功后,一般会将登录状态记录到 Session 中,或者是给用户签发一个 Token,无论哪一种方式,都需要在客户端保存一些信息(Session ID 或 Token ),并要求客户端在之后的每次请求中携带它们。

在这样的场景下,使用 Cookie 无疑是最方便的,因此我们一般都会将 Session 的 ID 或 Token 保存到 Cookie 中,当服务端收到请求后,通过验证 Cookie 中的信息来判断用户是否登录 。

单点登录(Single Sign On, SSO)是指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的应用系统。

举例来说,百度贴吧和百度地图是百度公司旗下的两个不同的应用系统,如果用户在百度贴吧登录过之后,当他访问百度地图时无需再次登录,那么就说明百度贴吧和百度地图之间实现了单点登录。

单点登录的本质就是在多个应用系统中共享登录状态。如果用户的登录状态是记录在 Session 中的,要实现共享登录状态,就要先共享 Session,比如可以将 Session 序列化到 Redis 中,让多个应用系统共享同一个 Redis,直接读取 Redis 来获取 Session。

当然仅此是不够的,因为不同的应用系统有着不同的域名,尽管 Session 共享了,但是由于 Session ID 是往往保存在浏览器 Cookie 中的,因此存在作用域的限制,无法跨域名传递,也就是说当用户在 app1.com 中登录后,Session ID 仅在浏览器访问 app1.com 时才会自动在请求头中携带,而当浏览器访问 app2.com 时,Session ID 是不会被带过去的。实现单点登录的关键在于,如何让 Session ID(或 Token)在多个域中共享。

实现方式一:父域 Cookie

在将具体实现之前,我们先来聊一聊 Cookie 的作用域。

Cookie 的作用域由 domain 属性和 path 属性共同决定。domain 属性的有效值为当前域或其父域的域名/IP地址,在 Tomcat 中,domain 属性默认为当前域的域名/IP地址。path 属性的有效值是以“/”开头的路径,在 Tomcat 中,path 属性默认为当前 Web 应用的上下文路径。

如果将 Cookie 的 domain 属性设置为当前域的父域,那么就认为它是父域 Cookie。Cookie 有一个特点,即父域中的 Cookie 被子域所共享,换言之,子域会自动继承父域中的Cookie。

利用 Cookie 的这个特点,不难想到,将 Session ID(或 Token)保存到父域中不就行了。没错,我们只需要将 Cookie 的 domain 属性设置为父域的域名(主域名),同时将 Cookie 的 path 属性设置为根路径,这样所有的子域应用就都可以访问到这个 Cookie 了。

不过这要求应用系统的域名需建立在一个共同的主域名之下,如 tieba.baidu.com 和 map.baidu.com,它们都建立在 baidu.com 这个主域名之下,那么它们就可以通过这种方式来实现单点登录。

总结:此种实现方式比较简单,但不支持跨主域名。

实现方式二:认证中心

我们可以部署一个认证中心,认证中心就是一个专门负责处理登录请求的独立的 Web 服务。

用户统一在认证中心进行登录,登录成功后,认证中心记录用户的登录状态,并将 Token 写入 Cookie。(注意这个 Cookie 是认证中心的,应用系统是访问不到的。)

应用系统检查当前请求有没有 Token,如果没有,说明用户在当前系统中尚未登录,那么就将页面跳转至认证中心。由于这个操作会将认证中心的 Cookie 自动带过去,因此,认证中心能够根据 Cookie 知道用户是否已经登录过了。

如果认证中心发现用户尚未登录,则返回登录页面,等待用户登录,如果发现用户已经登录过了,就不会让用户再次登录了,而是会跳转回目标 URL ,并在跳转前生成一个 Token,拼接在目标 URL 的后面,回传给目标应用系统。

应用系统拿到 Token 之后,还需要向认证中心确认下 Token 的合法性,防止用户伪造。确认无误后,应用系统记录用户的登录状态,并将 Token 写入 Cookie,然后给本次访问放行。(注意这个 Cookie 是当前应用系统的,其他应用系统是访问不到的。)当用户再次访问当前应用系统时,就会自动带上这个 Token,应用系统验证 Token 发现用户已登录,于是就不会有认证中心什么事了。

这里顺便介绍两款认证中心的开源实现:

Apereo CAS 是一个企业级单点登录系统,其中 CAS 的意思是”Central Authentication Service“。它最初是耶鲁大学实验室的项目,后来转让给了 JASIG 组织,项目更名为 JASIG CAS,后来该组织并入了Apereo 基金会,项目也随之更名为 Apereo CAS。

XXL-SSO 是一个简易的单点登录系统,由大众点评工程师许雪里个人开发,代码比较简单,没有做安全控制,因而不推荐直接应用在项目中,这里列出来仅供参考。

总结:此种实现方式相对复杂,支持跨域,扩展性好,是单点登录的标准做法。

实现方式三:LocalStorage 跨域

前面,我们说实现单点登录的关键在于,如何让 Session ID(或 Token)在多个域中共享。

父域 Cookie 确实是一种不错的解决方案,但是不支持跨域。那么有没有什么奇淫技巧能够让 Cookie 跨域传递呢?

很遗憾,浏览器对 Cookie 的跨域限制越来越严格。Chrome 浏览器还给 Cookie 新增了一个 SameSite 属性,此举几乎禁止了一切跨域请求的 Cookie 传递(超链接除外),并且只有当使用 HTTPs 协议时,才有可能被允许在 AJAX 跨域请求中接受服务器传来的 Cookie。

不过,在前后端分离的情况下,完全可以不使用 Cookie,我们可以选择将 Session ID (或 Token )保存到浏览器的 LocalStorage 中,让前端在每次向后端发送请求时,主动将 LocalStorage 的数据传递给服务端。这些都是由前端来控制的,后端需要做的仅仅是在用户登录成功后,将 Session ID (或 Token )放在响应体中传递给前端。

在这样的场景下,单点登录完全可以在前端实现。前端拿到 Session ID (或 Token )后,除了将它写入自己的 LocalStorage 中之外,还可以通过特殊手段将它写入多个其他域下的 LocalStorage 中。

关键代码如下:

pIYBAGAY6qSAOlmYAACeeFqnF0Q316.jpg

前端通过 iframe+postMessage() 方式,将同一份 Token 写入到了多个域下的 LocalStorage 中,前端每次在向后端发送请求之前,都会主动从 LocalStorage 中读取 Token 并在请求中携带,这样就实现了同一份 Token 被多个域所共享。

总结:此种实现方式完全由前端控制,几乎不需要后端参与,同样支持跨域。

补充:域名分级

从专业的角度来说(根据《计算机网络》中的定义),.com、.cn 为一级域名(也称顶级域名),.com.cn、baidu.com 为二级域名,sina.com.cn、tieba.baidu.com 为三级域名,以此类推,N 级域名就是 N-1 级域名的直接子域名。

从使用者的角度来说,一般把可支持独立备案的主域名称作一级域名,如 baidu.com、sina.com.cn 皆可称作一级域名,在主域名下建立的直接子域名称作二级域名,如 tieba.baidu.com 为二级域名。

为了避免歧义,本人将使用“主域名“替代”一级域名“的说法。

责任编辑:xj

原文标题:单点登录的三种实现方式

文章出处:【微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 域名
    +关注

    关注

    0

    文章

    74

    浏览量

    11357
  • Cookie
    +关注

    关注

    0

    文章

    30

    浏览量

    10435

原文标题:单点登录的三种实现方式

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    deepseek登录不了怎么办?

    建议先检查网络连接,确认账号密码正确,尝试清除缓存或切换设备登录。若仍失败,可访问官方状态页查看服务公告,或联系客服协助解决。
    的头像 发表于 02-07 09:42 323次阅读

    如何远程登录路由器

    当路由器放置在机房、弱电箱等不方便直接操作的位置,或当网络出现故障或者需要远程协助时远程登录路由器可以极大的解决问,本期重点说明远程登录路由器的方法,供各位参考使用: 首先 ,需要确保家里的路由器
    的头像 发表于 12-18 12:01 243次阅读
    如何远程<b class='flag-5'>登录</b>路由器

    AD9814如何与AGND和DGND连接?分别单点接地吗?

    模拟和数字管脚,将芯片人为的分为AGND和DGND,在芯片的bottom层或者远端加一个0欧电阻单点接地. 哪种分地更合理呢?上面那段话的single强调的是“同一个”还是“单独的”呢?有些ADC手册不提分地(circuit and layout),管脚模拟地和数字地的
    发表于 12-05 06:33

    单点位移计:从原理到应用,一文读懂!

    与广泛应用吧!什么是单点位移计简单来说,单点位移计是一种用于测量物体沿某一特定方向上微小移动距离的高精度传感器。它通过将物理位移转换为电信号,从而实现对位移的精确监
    的头像 发表于 11-25 15:54 337次阅读
    <b class='flag-5'>单点</b>位移计:从原理到应用,一文读懂!

    功放地和数字地应采用哪种方式

    1、功放地和数字地应采用哪种方式2、本人在电路设计中采用了单点接地方式,发现音箱时而有声,时而无声。经测试发现功放在工作时,数字地和功放地之间很大的脉冲电压。请问这种脉冲电压干扰是
    发表于 10-25 09:17

    多点触控和单点触控哪个好

    多点触控和单点触控各有其优缺点,具体哪个更好取决于应用场景和用户需求。以下是对两者的详细比较:
    的头像 发表于 10-21 15:36 761次阅读

    多点触控和单点触控区别

     多点触控和单点触控是触摸屏技术的两种主要类型,它们在功能、应用场景以及用户体验等方面存在显著差异。以下是对这两种触控技术的详细比较:
    的头像 发表于 10-21 15:35 1718次阅读

    交换机如何配置SSH远程登录

    从事网络运维工作的小伙伴们都知道,在交换机正式上线时,必须完成配置SSH远程登录,这样做目的是为了日后,维护方便,不需要每次登录设备都要跑到机房,这样既不现实,又费事。
    的头像 发表于 10-10 14:33 1394次阅读
    交换机如何配置SSH远程<b class='flag-5'>登录</b>

    阻容耦合方式的优点哪些

    利用电阻和电容元件实现信号传输的方式。在阻容耦合电路中,信号通过电阻元件传输,而电容元件则起到耦合信号的作用。阻容耦合方式的基本电路结构包括输入电阻、耦合电容、输出电阻和负载电容。 阻容耦合
    的头像 发表于 08-09 15:32 1148次阅读

    Jtti:如何在服务器扩展时避免单点故障?哪些常见的高可用性策略?

    服务器扩展是组织应对不断增长的业务需求和数据负载的重要手段。然而,随之而来的却是更大规模的风险,存在单点故障可能导致整个系统的宕机,严重影响业务连续性和用户体验。 避免单点故障的策略 冗余备份 在
    的头像 发表于 07-18 16:02 303次阅读

    wds的常用组网哪几种?

    (Point-to-Point)模式 点对点模式是WDS中最常用的一种组网方式,主要用于实现两个或多个无线设备之间的直接通信。在这种模式下,两个无线设备之间建立一个无线链路,实现数据的传输。这种模式适用于两个无线设备之间的距离较
    的头像 发表于 07-18 09:52 1391次阅读

    控制阀哪几种控制方式

    控制阀是工业自动化系统中的重要组成部分,其主要作用是控制流体的流量、压力、温度等参数,以满足生产过程的需要。控制阀的控制方式很多种,不同的控制方式适用于不同的应用场景。本文将详细介绍控制阀的几种
    的头像 发表于 06-30 09:51 1067次阅读

    苹果将推“密码”应用,简化用户登录体验

    近日,媒体报道援引内部知情人士的消息称,科技巨头苹果公司正计划在下周推出一款名为“密码”的自制新应用,此举意在为用户登录网站和软件提供更便捷的方式。据悉,这款新应用将作为即将发布的iOS 18
    的头像 发表于 06-11 09:29 548次阅读

    java实现多线程的几种方式

    Java实现多线程的几种方式 多线程是指程序中包含了两个或以上的线程,每个线程都可以并行执行不同的任务或操作。Java中的多线程可以提高程序的效率和性能,使得程序可以同时处理多个任务。 Java提供
    的头像 发表于 03-14 16:55 797次阅读

    信道均衡哪些实现方式

    信道均衡的实现方式主要包括线性自动应均衡、盲均衡和半盲均衡等。这些方法各有特点,选择哪种方法取决于具体的应用场景和性能要求。例如,如果信道变化较快,可能需要使用自适应滤波器来实现实时的信道均衡。而在信道特性较为稳定的环境中,线性
    的头像 发表于 03-02 14:05 1501次阅读