aurora登录认证过程

aurora登录认证过程

aurora在原始的登录过程中做了改进,可以从数据库中查找用户信息,将查找得到的Authenticatino对象存放到redis数据库中,并且利用JWT方式从redis中验证用户是否认证过。另外还记得上面说过认证成功和认证失败之后会执行用户定义的handler吗,aurora设置了对应的类。

从数据库中查找用户数据

记得上面说过在DaoAuthenticationProvider中如果在缓存中无法查到信息就会调用retrieveUser()方法,而retrieveUser()方法会调用getUserDetailsService()方法,得到UserDetailsService对象,执行我们自己在登录时候编写的 loadUserByUsername()方法。所以为了能够从数据库中查找用户数据需要自己实现UserDetailsService对象,交给springboot注册到DaoAuthenticationProvider当中。

继承UserDetailsService实现loadUserByUsername方法。loadUserByUsername可以使用的参数为用户名,接收到用户名之后从数据库中查找该用户的信息,再将搜寻到的用户信息转化为UserDetails对象即可。下图先得到基本的认证信息,然后再查找权限信息和登录信息一起封装到UserDetailsDTO中返回。

在这里插入图片描述

在这里插入图片描述

需要自定义UserDetailsDTO对象实现UserDetails。

利用JWT进行认证

为了避免每次都从数据库中查找用户数据进行认证,可以结合redis使用JWT技术,利用前端传来的token从redis中查找用户的Authentication信息。如果能够从redis中得到就直接保存在SecurityContextHolder中,如果找不到再继续执行数据库查找认证的过程。

  1. 设置过滤器在UsernamePasswordAuthenticationFilter数据库认证之前。如下图所示:


    在这里插入图片描述

可以看到编写了一个JwtAuthenticationTokenFilter过滤器,并设置在了UsernamePasswordAuthenticationFilter之前。

在JwtAuthenticationTokenFilter中根据tokenService.getUserDetailDTO(request)利用请求得到UserDetailsDTO信息,如果能够得到该信息则更新redis中token的过期时间,然后将UserDetailsDTO封装成Authentication对象保存在SecurityContextHolder中,过滤链结束。如果不存在用户信息那么进入UsernamePasswordAuthenticationFilter中从数据库中查找信息。

  1. tokenService.getUserDetailDTO(request)

该方法利用request中的token信息在redis中查找用户信息。redis中是以hash表的方式存放用户信息的,键为userid,值为userdetialsdto。先从请求中得到token信息,解析token得到userid,再从redis中得到信息。

在这里插入图片描述

  1. renewToken的作用就是在redis中更新用户信息的过期时间。
自定义AuthenticationSuccessHandler

还记得AuthenticationSuccessHandler中的onAuthenticationSuccess函数吗?上文提到的在UsernamePasswordAuthenticationFilter中验证成功之后先把authentication存放到SecurityContextHolder中,然后再调用AuthenticationSuccessHandler中的onAuthenticationSuccess。如果我们想使用JWT进行认证那么就需要在认证成功之后将数据存放到redis中,自定义的AuthenticationSuccessHandler就实现了这个功能。

在这里插入图片描述

在tokenService.createToken中就是将userDetailDTO中的id作为键,userDetailDTO作为值存到redis中,然后将userDetailDTO中的id作为subject存放到token中包装成ResultVO.ok(userLoginDTO)返回给前端。

自定义AuthenticationFailureHandler

为了让前端统一接受信息的风格,自定义编写AuthenticationFailureHandler对象,这个在认证失败之后会调用。主要作用是将失败信息包装成ResultVO.fail(e.getMessage())返回给前端。

在这里插入图片描述

配置处理器

在security中将上面两个处理器配置

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值