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编辑  收藏  举报