单点登录原理:
单点登录的实现方案,一般就包含:Cookies,Session同步,分布式Session方式,目前的大型网站都是采用分布式Session的方式。我先从cookie的实现谈起,你就能很清楚的知道为什么需要分布式session方式实现单点登录。
先上图:
其中,Application表示业务系统,每个业务系统都有自己的登陆系统,也就表示每个业务系统都能单独发布、运行、服务权限认证;但是,当在项目当中集成其他的业务系统时,就需要将登陆系统提取出来,这样就形成了SSO系统(单点登录系统)。
实现描述:
- 用户访问Application1系统,Application1系统是需要登录的,但用户现在没有登录。
- 跳转到SSO登录系统。SSO系统也没有登录,弹出用户登录页。
- 用户填写用户名、密码,SSO系统进行认证后,将登录状态写入SSO的session,浏览器(Browser)中写入SSO域下的Cookie。
- SSO系统登录完成后会生成一个ST(Service Ticket),然后跳转到Application1系统,同时将ST作为参数传递给Application1系统。
- Application1系统拿到ST参数后,从后台向SSO发送请求,验证ST参数是否有效。
- 验证通过后,Application1系统将登录状态写入session并设置Application1域下的Cookie。
至此,跨域单点登录就完成了。以后我们再访问app系统时,app就是登录的。接下来,我们再看看访问Application2系统时的流程。
- 用户携带ST参数访问Application2系统,Application2系统没有登录,跳转到SSO。
- 由于SSO已经登录了,不需要重新登录认证。
- SSO生成ST参数,浏览器跳转到Application2系统,并将ST参数作为参数传递给Application2系统。
- Application2系统拿到ST参数,后台访问SSO,验证ST参数是否有效。
- 验证成功后,Application2将登录状态写入session,并在Application2域下写入Cookie。
这样,Application2系统不需要走登录流程,就已经是登录了。SSO,Application1和Application2在不同的域,它们之间的session不共享也是没问题的。