XXL-SSO实现单点登录
认证原理
通过中央服务器实现单点登录

认证过程
认证服务器 =====> 认证服务接口 =====> 数据库验证
redis:共用的数据库
过滤器:拦截浏览器的请求
认证详细流程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8akPQ2jp-1660307882987)(F:\Program Files\feiq\Recv Files\Day20220812-微服务项目-XXL-SSO认证-下午\单点登录SSO-专题\XXL-SSO.png)]](https://code84.com/wp-content/uploads/2022/09/7f07eb2560f3445ca30dda9ac1655606.png)
- 浏览器发起请求
- 过滤器拦截,如果属于白名单(不需要登陆的页面地址)就直接放行
- 从cookie中获取sessionid
- 根据sessionid查询redis数据库,获取用户数据
- 如果获取到了,说明已经认证过了,设置用户并放行
- 如果没有获取到,再从URL地址中获取sessionid
- 查询redis数据库,获取用户数据
- 如果获取到了,设置用户并放行
- 如果最终没有获取到用户信息,要么没有认证通过,要么用户信息失效了
- 跳转到登陆页面,进行用户认证
- 认证失败跳回登录页面,认证通过重定向到客户端
认证通过详细流程
- 封装用户信息到一个xxluser中
- 根据xxluser生成一个sessionid
- 将xxluser存入redis数据库中,key为用户id
- 将session存入cookie中(中央服务器的cookie)
- 获取回调地址,重定向到客户端,将sessionid拼接到请求地址中
- 服务器给浏览器存一个cookie,存放的是sessionid
认证详细流程图

cookie不能跨域,XXL-SSO是怎么实现单点登录的
假设用户请求了一个客户端,并且登录认证通过了,然后用户要请求其它的客户端,但是前一个客户端的cookie不能用在这个请求中,也就相当于用户在请求新的客户端时,携带不了cookie,那么XXL-SSO是怎么实现让没有携带cookie的客户端也通过认证的呢
原因在于第一次登录通过时,中央服务器会存储一个sessionid在自己的cookie中,如果这时一个没有携带cookie的请求进来了,中央服务器就会使用自己的sessionid去获取redis中的数据,查看有没有失效。如果没有失效,就将sessionid拼接到回调地址中,重定向到客户端。所以在使用一个产品的服务时,只要认证通过了其中一个服务并且认证还没有失效时,就相当于认证通过了这个产品的任何服务。
可以回想一个场景,当我们使用百度搜索引擎时,如果我们登录了百度的账号,那么百度相关的其他服务都不再需要登录,这个就是单点登录。但也有一个很明显的问题,就是实现了单点登录的服务无法同时登录多个账号,如果要登录其他账号,就必须将已登录的账号注销掉。
加入A客户端登录了,要去访问B客户端,怎么去判定A和B是同一个浏览器发出的请求
注销原理
清除cookie和redis数据,即使还有客户端请求携带cookie,因为redis数据被清理了,认证通不过,还是会跳转登录页面
版权声明:本文为m0_47360542原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。