XXL-SSO实现单点登录

XXL-SSO实现单点登录

认证原理

通过中央服务器实现单点登录

在这里插入图片描述

认证过程

认证服务器 =====> 认证服务接口 =====> 数据库验证

redis:共用的数据库

过滤器:拦截浏览器的请求

认证详细流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8akPQ2jp-1660307882987)(F:\Program Files\feiq\Recv Files\Day20220812-微服务项目-XXL-SSO认证-下午\单点登录SSO-专题\XXL-SSO.png)]

  1. 浏览器发起请求
  2. 过滤器拦截,如果属于白名单(不需要登陆的页面地址)就直接放行
  3. 从cookie中获取sessionid
  4. 根据sessionid查询redis数据库,获取用户数据
  5. 如果获取到了,说明已经认证过了,设置用户并放行
    1. 如果没有获取到,再从URL地址中获取sessionid
    2. 查询redis数据库,获取用户数据
    3. 如果获取到了,设置用户并放行
  6. 如果最终没有获取到用户信息,要么没有认证通过,要么用户信息失效了
  7. 跳转到登陆页面,进行用户认证
  8. 认证失败跳回登录页面,认证通过重定向到客户端

认证通过详细流程

  1. 封装用户信息到一个xxluser中
  2. 根据xxluser生成一个sessionid
  3. 将xxluser存入redis数据库中,key为用户id
  4. 将session存入cookie中(中央服务器的cookie)
  5. 获取回调地址,重定向到客户端,将sessionid拼接到请求地址中
  6. 服务器给浏览器存一个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版权协议,转载请附上原文出处链接和本声明。