SpringSecurity - RememberMe
SpringSecurity 记住我原理:
一、创建token
进入UsernamePasswordAuthticationFilter进行用户信息验证,验证成功之后它会调用一个AbstractAuthenticationProcessingFilter的过滤器进入一个successfulAuthentication方法中将用户的信息存入session中,然后调用RememberService调用loginSuccess方法,在这个方法中它又会调用rememberMeRequested方法,这个方法返回一个Boolean值,判断是否设置好RemeberMe这个功能。在rememberMeRequested这个方法中它会获取登录页面传送过来的remember-me这个参数,因为我们设置了value=”true”,因此它不为空并且该方法返回true。
接着:
其中 parameter 默认为 remember-me
TokenRepository将Token存入数据库中,并且将Token存入cookie中。在TokenRepository中调用我们上面实现的JdbcTokenRepositoryImpl bean的createNewToken方法内部实际上使用JdbcTemplate在更新数据库插入了当前Token。
在存入cookie是读取设置的过期参数,然后创建一个cookie通过response响应到浏览器存入cookie中。
二、验证token
看一下RememberMeAuthenticationFilter 位置:
当我们重新启动项目访问页面时,由于session被销毁,但是cookie中存在Token,它会到RememberMeAuthenticationFilter中读取session中的值,由于是重启项目,session被销毁,因此session为空,它会去到cookie中取是否存在Token,遍历cookie获取到RememberMe的Token,然后根据Token获取用户信息返回调用的URL信息。
检查cookie中有无 remember-me 参数:
有该参数的话,则解密该参数的值,然后 去数据库取出该token对应的信息,判断有无过期,校验通过
上面就是Spring Security实现RemeberMe功能的原理,关键是掌握功能的原理图,然后查看源码即可清楚的理解它的流程。
posted on 2021-11-09 11:57 TrustNature 阅读(58) 评论(0) 编辑 收藏 举报