为什么需要单点登录单点登录SSO(SingleSignOn)简单来说就是在多系统共存的环境下,用户在登录后在一个地方,不需要在其他系统登录,即一个用户的登录可以被所有其他系统信任。单点登录在大型网站中使用非常频繁。比如阿里旗下拥有淘宝、天猫等网站,背后有数百个子系统。一次用户操作或交易可能涉及数十个子系统的协作,如果每个子系统都需要用户认证,不仅用户会发疯,每个子系统也会为这种反复认证授权的逻辑发疯。因此,单点登录的解决方案是用户只需要登录一次就可以访问所有相互信任的应用系统。单点登录的来源1.早期的web单系统应用早期我们开发web应用,都是把所有的包一起打成一个war包,放到tomcat容器中运行。所有的功能,所有的业务,后台管理,门户界面,都是这一战支持的。这样的单体应用也被称为单体应用,因为它很难扩展和拆分。在巨石应用下,用户的登录和权限都非常简单。当浏览器向服务器发送登录请求,验证通过后,会将用户信息存储在seesion中,然后服务器生成一个sessionId放入cookie中,然后返回给浏览器。大致可以用下图来表示:验证登录的session就是session,它维护用户态,也就是所谓的HTTP有状态协议。我们经常可以在浏览器中看到JSESSIONID,它是用来维护这种关系的key。单点登录SSO实现原理及解决方案详解-mikechen的互联网架构2.分布式集群部署随着网站访问量越来越大,单机部署已经是一个巨大的瓶颈,于是就有了后来的分布式集群部署。例如:如果引入集群的概念,单个应用可能会重新部署在3台以上的tomcat服务器上,使用nginx来实现反向代理。但是添加新服务器后,不同服务器之间的sessionId是不一样的。有可能你在服务器A上登录成功,可以从服务器的session中获取到用户信息,但是在服务器B上找不到session信息,只好注销继续登录。结果,服务器A中的session超时过期,登录后强制退出,要求重新登录。因此,我们不得不考虑多台服务器之间session数据一致性的问题,这是单点登录最早的源头。单点登录的实现单点登录的本质是在多个应用系统中共享登录状态。如果Session中记录了用户的登录状态,为了共享登录状态,必须先共享Session。所以实现单点登录的关键是如何在多个域中共享SessionID(或Token)。1、同域单点登录。一个企业一般只有一个域名,不同的系统通过二级域名来区分。比如我有一个域名:mikechen.cc,有两个业务系统:blog.mikechen.ccvideo.mikechen.cc我们要做单点登录(SSO),需要一个登录系统叫:sso。麦克陈.cc只要我们登录sso.mikechen.cc,blog.mikechen.cc和video.mikechen.cc也登录了。实现方法:其实这里就是利用二级域名来写cookie一级域名。使用sso.mikechen.cc登录后,可以将cookie的域设置为顶级域,即.mikechen.cc,这样子域blog.mikechen.cc和video.mikechen.cc下的所有系统都可以访问顶级域的cookie。这种实现比较简单,但是不支持跨一级域名,限制同一级域名。2、异域下单点登录同域下单点登录是对cookie顶级域特性的巧妙利用。不同域呢,比如:下面三个是mikechen1.ccmikechen2.ccmikechen3.cc不同域的实现:我们可以部署一个SSO认证中心,这个认证中心是专门负责处理登录请求的。所有请求(登录、注销、获取用户信息、当前用户状态)请求sso系统,sso系统维护用户信息。这种实现比较复杂,支持跨域,扩展性好。这是单点登录的标准做法。基于SSO认证中心的开源项目代表:CAS,其中CAS是CentralAuthenticationService,即中央认证服务。点击登录获取介绍!-END-作者简介:mikechen,十余年BAT架构经验,资深技术专家,曾就职于阿里、淘宝、百度。欢迎关注我的个人公众号:mikechen的互联网架构,十余年BAT架构经验!在公众号菜单栏对话框中回复【架构】关键字,即可查看我原创的300+BAT架构技术系列文章和1000+大厂面试问答合集。