单点登陆SSO实现方式浅谈

    单点登陆(SSO)通常用于将多个系统串联起来,统一身份验证,简化用户登陆步骤,实现登陆一次即可自动登陆所有相互信任的应用系统。架构单点登陆系统有多种方式,先将我所查阅的资料和感悟与大家分享,有不足之处还望不吝赐教。

1. Session共享 

    这算是实现单点登陆最简单的一种方式了。一般用redis集群即可做到,将用户的session id放置在cookie*域中即可在子系统中直接应用,代码成本低,有比较好的开源实现,比如 https://github.com/jcoleman/tomcat-redis-session-manager 。 但是这种方式的缺点也是明显的,只能应用在子系统中,跨*域名的情况就束手无策了。

2. SSO(cookie实现)

    用户先向sso系统请求登陆A系统的凭证,获取凭证之后将凭证存放在cookie中,然后带着cookie请求登陆系统A,系统A检测到凭证的存在向SSO系统验证凭证是否正确,凭证正确则登陆成功,流程草图如下

单点登陆SSO实现方式浅谈

    此种方式未解决跨域的问题,cookie的存储载体是*域,只能在子系统中应用sso,每个子系统单独验证,并且具有白名单功能,在某些不需要跨域的系统中也是一个可行的解决方案。

3. SSO

    与cookie的实现方式不同,这种方式将凭证仅存于url中,流程草图如下

单点登陆SSO实现方式浅谈

    

3的方式完美解决跨域的问题,也是现在架构中常用的sso解决方案。当中还有许多技术细节没有体现出来,比如白名单的实现,凭证时效性的实现,sso单点系统压力等,这些需要在实际使用中进行修改和调整。

最后奉上sso的一个开源实现 经典的CAS  https://github.com/apereo/cas

 

 

转载于:https://my.oschina.net/lanshu/blog/888967