跨域分布式系统单点登录的实现(CAS单点登录)

发布时间:2022-07-05 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了跨域分布式系统单点登录的实现(CAS单点登录)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

1. 概述

上一次我们聊了一下《使用redis实现分布式会话》,原理就是使用 客户端Cookie + Redis 的方式来验证用户是否登录

如果分布式系统中,只是对Tomcat做了负载均衡,或者所有的子系统都在同一个二级域名下,则 客户端Cookie + Redis 的方式是可以支持验证用户是否登录的。

如果分布式系统中包含了不同域名的子系统,之前的 客户端Cookie + Redis 的方式就不支持了,因为二级域名不同,Cookie无法共享。

例如:浏览器在子系统A的二级域名中保存了Cookie,在访问子系统B时,无法从Cookie中拿到数据,因此没有依据判断用户是否登录。

此时我们就需要引入CAS(中央认证服务),让CAS帮助我们实现跨域单点登录。

今天我们就来聊聊这个跨域分布式系统单点登录的实现。

 

2. 场景说明

子系统A域名:www.a.COM

子系统B域名:www.b.com

CAS系统域名:www.cas.com

当子系统A和子系统B都未登录,则客户端请求时需要登录。

当客户端请求子系统A触发了登录,且登录成功,则客户端再请求子系统B时,不需要登录,可直接访问。

 

3.概念说明

全局票据:一个全局唯一的uuid,存放在域名为 .cas.com 的 Cookie 中,是用户已登录的标识。

临时票据:一个全局唯一的uuid,存放在Redis中,有过期时限,用于验证用户的身份。

 

4. 跨域单点登录的实现逻辑

4.1 用户访问子系统A

用户访问子系统A的页面,子系统A的页面请求子系统A的后台接口,子系统A后台检查当前系统的Cookie中是否存在用户脱敏信息。

因为从未登录过,所以Cookie中是不存在用户脱敏信息的,子系统A后台再检查参数中是否包含临时票据,此时是没有的,因此子系统A后台返回未登录给客户端。

客户端将当前子系统A页面的 url 作为参数,重定向到CAS系统的登录页面。

 

4.2 用户在CAS系统登录

重定向到CAS系统的登录页,登录页首先判断客户端在CAS系统的Cookie中,是否存在全局票据。

因为没有登录过,所以在CAS系统的Cookie中不存在全局票据,用户需要填写用户名、密码进行登录。

用户在CAS系统的登录页面,填写用户名、密码后,提交登录。

CAS系统后台,校验用户名、密码,通过后,生成一个全局唯一的 uuid,作为全局票据。

将全局票据存储在域名为 .cas.com 的 Cookie 中。

以全局票据为 key,用户ID 为 value,存到 Redis 中。

以用户ID为 key,用户信息为 value,存到 Redis 中。

再生成一个 uuid 作为临时票据,以临时票据为 key,临时票据为 value,存储到Redis中,5分钟过期。

CAS系统返回临时票据给客户端。

客户端将页面重定向回子系统A的页面,临时票据作为参数携带。

 

4.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中用户信息不存在,则表示用户已注销登录,则返回未登录。

 

4.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,不需要再次输入用户名、密码去登录。

 

4.5 用户注销

用户注销时,首先清空当前子系统中用户脱敏信息的Cookie。

然后访问CAS系统的用户注销接口。

CAS系统,从Cookie中拿到全局票据,根据全局票据从Redis中得到用户ID。

删除cookie中的全局票据。

从Redis中删除 key 为 全局票据 的数据。

从Redis中删除 key 为 用户ID 的数据 。

 

4.6 总结

这里用了一个小技巧,a.com 和 b.com 的 Cookie 无法共享,因此就在一个公共的 cas.com 中去存Cookie,然后再做一次身份校验就可以了。

 

5. 综述

今天简单聊了一下跨域分布式系统单点登录的实现,希望能对大家的工作有所帮助。

欢迎大家帮忙点赞、评论、加关注 :)

关注追风人聊Java,每天更新Java干货。

脚本宝典总结

以上是脚本宝典为你收集整理的跨域分布式系统单点登录的实现(CAS单点登录)全部内容,希望文章能够帮你解决跨域分布式系统单点登录的实现(CAS单点登录)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。