单点登陆业务逻辑
1、点击登陆按钮时,首先是有一个全局过滤器。
1、首先拿到填写的用户名密码,根据用户名去数据库查到密码,然后将数据库中解密后的密码和前台传来的密码进行对比。(验证通过继续,不通过返回用户名密码错误)
2、拿到用户名去redis中查询是否有此用户名的token(redis中所有的用户信息是存储在一个userMap中,获取userMap的userName的value值):
如果是null
(1)表示没有登陆过或者过期,利用UUID生成一个token,然后以用户名为key,token为value组合成hash放到redis的userMap中。
(2)将token为key,将用户名为value放入redis中,并且设置10分钟的过期时间。
(3)然后对路径继续访问,访问成功后,以token为key,token+userName为value,重置了以上的redis数据。
如果不是null
(1)拿此token为key去redis中查是否存在(过期):
①如果存在,则用户正常直接登陆。
②如果不存在,则重新生成一个UUID作为token,重新进行上面的一步(然后以用户名为key,token为value组合成hash放到redis中。同时将token为key,将用户名为value放入redis中,并且设置过期时间。)
最后,服务器将生成的ssoToken保存到session中,然后返回给浏览器。
3、在用户退出登陆时,是在自己在项目中添加了一个过滤器进行处理的,首先在redis中将token为主键的数据删除,然后对session调用invalidate()方法。
4、如果是直接访问的浏览器路径,而不是访问登陆路径,有一个全局的过滤器对请求进行过滤,request便不会有loginName和password,可以直接去session中取,如果能取到的话,拿着token区redis中验证是否有用户。