一,单点登陆的定义
单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁,例如像阿里巴巴这样的网站,在网站的背后是成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯掉。实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效性,因此要点也就以下两个:存储信任和验证信任。
二,解决方案
一般说来,大型应用会把授权的逻辑与用户信息的相关逻辑独立成一个应用,称为用户中心。 用户中心不处理业务逻辑,只是处理用户信息的管理以及授权给第三方应用。第三方应用需要登录的时候,则把用户的登录请求转发给用户中心进行处理,用户处理完毕返回凭证,第三方应用验证凭证,通过后就登录用户。
三,方案设计
单点登录的大致流程如下:
1.用户首次访问A系统,A系统发现用户未登录,则重定向到SSO认证中心并携带请求url,进行登录验证;
2.用户在SSO认证中心进行用户名和密码验证登录,登录成功后,服务器生成一个令牌ticket(相当于token,可以对用户id进行加密生成),然后重定向到系统A的源url并将该ticket追加到url参数。
3.系统A获取到url参数中的ticket,向SSO发起ticket校验,校验成功,则系统A放行,并将ticket存入到cookie。
4.用户访问B系统,此时B系统domain下已经携带ticket,直接向SSO发起ticket校验,校验成功,则放行,并将ticket存入cookie(更新ticket过期时间)
5.用户登出时,移除domain下的cookie。
说明:第三步向SSO发起ticket校验,能够有效防止他人直接截获cookie而获得权限。考虑到是子系统之间共享的cookie,所以清除子系统的cookie即可。
四,原理图
说明: 图中token验证为了方便存在将token存在redis中,不用redis可以替代成从数据库中获取用户信息认证即可。
五,Demo测试
#对应app-a,端口为7071
#对应app-b,端口为7071
#对应sso-server,端口为7070
1.首先启动这三个项目
2.然后访问app-a的home页面(http://localhost:7071/home),因为未登录所以跳转到sso的登录页面;
4.在app-b的Home界面退出登录,再访问app-a的home界面,则要求重新登录.