SSO单点登录
1、概述
单点登录图示:

CAS(中央认证服务)实现:

特性:
1、无需域名cookie共享;
2、无需共用分布式缓存redis。
1.2、场景说明
子系统A域名:www.a.com
子系统B域名:www.b.com
CAS系统域名:www.sso.com
当子系统A和子系统B都未登录,则客户端请求时需要登录。
当客户端请求子系统A触发了登录,且登录成功,则客户端再请求子系统B时,不需要登录,可直接访问。
1.3、概念说明
全局票据:一个全局唯一的uuid,存放在域名为 .sso.com 的 Cookie 中,是用户已登录的标识。
临时票据:一个全局唯一的uuid,存放在Redis中,有过期时限,用于验证用户的身份。
2、跨域单点登录的实现逻辑
2.1、用户访问子系统A
用户访问子系统A的页面,子系统A的页面请求子系统A的后台接口,子系统A后台检查当前系统的Cookie中是否存在用户脱敏信息。
因为从未登录过,所以Cookie中是不存在用户脱敏信息的,子系统A后台再检查参数中是否包含临时票据,此时是没有的,因此子系统A后台返回未登录给客户端。
客户端将当前子系统A页面的 url 作为参数,重定向到CAS系统的登录页面。
2.2 用户在CAS系统登录
重定向到CAS系统的登录页,登录页首先判断客户端在CAS系统的Cookie中,是否存在全局票据。
因为没有登录过,所以在CAS系统的Cookie中不存在全局票据,用户需要填写用户名、密码进行登录。
用户在CAS系统的登录页面,填写用户名、密码后,提交登录。
CAS系统后台,校验用户名、密码,通过后,生成一个全局唯一的 uuid,作为全局票据。
将全局票据存储在域名为 .sso.com 的 Cookie 中。
以全局票据为 key,用户ID 为 value,存到 Redis 中。
以用户ID为 key,用户信息为 value,存到 Redis 中。
再生成一个 uuid 作为临时票据,以临时票据为 key,临时票据为 value,存储到Redis中,5分钟过期。
CAS系统返回临时票据给客户端。
客户端将页面重定向回子系统A的页面,临时票据作为参数携带。
2.3 再次访问子系统A
页面被重定向回子系统A的页面。
子系统A携带临时票据访问子系统A的后台接口,后台检查当前系统的Cookie中是否存在用户脱敏信息,仍然是不存在。
后台检查参数中是否包含临时票据,临时票据是存在的,子系统A的后台调用CAS后台的用户身份验证接口,以临时票据作为参数。
CAS用户身份验证接口,以临时票据为key,从redis中获取value,value不为空,则验证成功。
从CAS系统的Cookie中得到全局票据,以全局票据为key,从Redis中得到用户ID,然后从redis中得到用户信息,返给子系统A的后台。
子系统A拿到用户信息后,将其脱敏,存储在域名为 .a.com 的 Cookie 中,然后完成接口逻辑。
子系统A再次访问其他接口时,后台检查当前系统的Cookie中是否存在用户脱敏信息,此时是存在的。
后台使用用户脱敏信息中的用户ID到Redis中获取完整的用户信息,然后完成接口逻辑。
如果Redis中用户信息不存在,则表示用户已注销登录,则返回未登录。
2.4 用户访问子系统B
用户访问子系统B,子系统B后台检查当前系统的Cookie中是否存在用户脱敏信息,不存在。然后检查是否存在临时票据,也不存在。返回未登录。
重定向到CAS系统的登录页面,子系统B页面的 url 作为参数。
CAS系统后台,判断在CAS系统的Cookie中,是否存在全局票据,此时是存在的,因为使用的是同一个客户端。
CAS系统后台生成一个uuid作为临时票据,以临时票据为 key,临时票据为 value,存储到Redis中,5分钟过期。
CAS系统返回临时票据给客户端。
客户端将页面重定向回子系统B的页面,临时票据作为参数携带。
子系统B携带临时票据访问子系统B的后台接口,后台检查当前系统的Cookie中是否存在用户脱敏信息,仍然是不存在。
后台检查参数中是否包含临时票据,临时票据是存在的,子系统B的后台调用CAS后台的用户身份验证接口,以临时票据作为参数。
CAS用户身份验证接口,以临时票据为key,从redis中获取value,value不为空,则验证成功。
从CAS系统的Cookie中得到全局票据,以全局票据为key,从Redis中得到用户ID,然后从redis中得到用户信息,返给子系统B的后台。
子系统B拿到用户信息后,将其脱敏,存储在域名为 .b.com 的 Cookie 中,然后完成接口逻辑。
这样一来,用户无感知的访问了子系统B,不需要再次输入用户名、密码去登录。
2.5 用户注销
用户注销时,首先清空当前子系统中用户脱敏信息的Cookie。
然后访问CAS系统的用户注销接口。
CAS系统,从Cookie中拿到全局票据,根据全局票据从Redis中得到用户ID。
删除Cookie中的全局票据。
从Redis中删除 key 为 全局票据 的数据。
从Redis中删除 key 为 用户ID 的数据 。


浙公网安备 33010602011771号