一个sso系统,集成单点登录和权限管理。
单点登录也算是个老生常谈的问题了,随着业务复杂度的提高,子系统的增多,每个系统都做一套登录注册显然是非常影响用户体验的,不仅浪费用户时间,也大大大增加了系统的维护成本,让后来维护的人苦不堪言。
最初的解决方法是用统一域名的子域名可以共享cookie的方式进行跨域同步,但这样的局限性也很明显,需要同一子域名。所以就姑且做一套和域名无关的一套系统出来吧,将登录注册和权限管理集中在一起管理。
这里假设A B两个网站为两套系统,域名分别为A.com和B.com。sso系统部署在C.com中。
现在假设一个用户访问A,并且A检测到用户未登录,则A在服务端构造URL,以get的形式使用户重定向到C,并将网站,时间,状态等信息传递给C。
此时,C即sso中心判断用户在c.com下的session状态,即用户有没有登录。
若未登录,则走一趟登录流程,激活session,生成一个ticket,并构造URL,重定向到A.com,将ticket等状态量给A。
此时A的服务端拿着这个ticket请求C.com下的鉴权接口,C将返回一个json信息,告诉A这个ticket的主人的信息,即用户名和登录状态。然后A.com拿到这个状态后在A.com下建立一个本地session,代表A登陆成功,以后用户与A的交互都将基于此session
以上即为用户未登录整个流程,不难想通,如果用户在已登录的情况下访问B,会进行以下操作:
- B.com检测到用户未登录,将其重定向到C。
- C检测到域下有session,通过检查状态发现已经登录,生成ticket,构造URL重定向到B。
- B拿着ticket问C这是谁。
- C返回相应的用户信息和登录状态。
- B拿到这个返回值后创建本地session。
至此,整个单点登录流程结束,用户在A登陆后即可直接在C的到登录状态。