在 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 中的,因此存在作用域的限制,无法跨域名传递,也就是说当用户在 http://app1.com 中登录后,Session ID 仅在浏览器访问 http://app1.com 时才会自动在请求头中携带,而当浏览器访问 http://app2.com 时,Session ID 是不会被带过去的。实现单点登录的关键在于,如何让 Session ID(或 Token)在多个域中共享。
作者:民工哥
链接:https://www.zhihu.com/question/342103776/answer/1984415411
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
推广一波 耶鲁大学登单点录(SSO Single Sign On)解决方案CAS (官网地址 https://www.apereo.org/projects/cas)。
架构比较简单的话推荐用cas,我的公司现在有很多子系统,共用一个权限管理系统,所以整合了cas 和 shiro。
服务端(无侵入式改造)和客户端(整合shiro buji-pac4j)代码请戳
服务端 : https://github.com/youngLake/cas5.2.6
客户端 : https://github.com/youngLake/cl
作者:不是鸡汤
链接:https://www.zhihu.com/question/342103776/answer/801152793
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



