单点登陆(SSO)通常用于将多个系统串联起来,统一身份验证,简化用户登陆步骤,实现登陆一次即可自动登陆所有相互信任的应用系统。架构单点登陆系统有多种方式,先将我所查阅的资料和感悟与大家分享,有不足之处还望不吝赐教。
1. Session共享
这算是实现单点登陆最简单的一种方式了。一般用redis集群即可做到,将用户的session id放置在cookie顶级域中即可在子系统中直接应用,代码成本低,有比较好的开源实现,比如 。 但是这种方式的缺点也是明显的,只能应用在子系统中,跨顶级域名的情况就束手无策了。
2. SSO(cookie实现)
用户先向sso系统请求登陆A系统的凭证,获取凭证之后将凭证存放在cookie中,然后带着cookie请求登陆系统A,系统A检测到凭证的存在向SSO系统验证凭证是否正确,凭证正确则登陆成功,流程草图如下
此种方式未解决跨域的问题,cookie的存储载体是顶级域,只能在子系统中应用sso,每个子系统单独验证,并且具有白名单功能,在某些不需要跨域的系统中也是一个可行的解决方案。
3. SSO
与cookie的实现方式不同,这种方式将凭证仅存于url中,流程草图如下
3的方式完美解决跨域的问题,也是现在架构中常用的sso解决方案。当中还有许多技术细节没有体现出来,比如白名单的实现,凭证时效性的实现,sso单点系统压力等,这些需要在实际使用中进行修改和调整。
最后奉上sso的一个开源实现 经典的CAS