SpringSecurity3.X的remember-me

本文详细解析了Spring Security中Remember-Me功能的工作原理及常见问题解决方法。介绍了登录流程并指出了ProviderManager中eraseCredentialsAfterAuthentication属性对Remember-Me的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在SpringSecurity中配置remember-me时,遇到这样的问题,remember-me没有起作用,按照官方文档的讲解,只需要在<http>中增加<remember-me />配置,并在login.jsp中增加如下代码即可:

<input id="_spring_security_remember_me" name="_spring_security_remember_me" type="checkbox" value="true"/>

简要说明一下SpringSecurity的登录过程:

UsernamePasswordAuthenticationFilter :获得用户提交的用户名和密码信息  
-->UserDetailsService :由其封装用户对象  
-->AbstractUserDetailsAuthenticationProvider :转由其进行密码和权限验证,验证通过后封装一个Authentication  
-->ProviderManager:会将Authentication封装到SecurityContext中(默认情况下,ProviderManager会在认证成功后清除掉Authentication的密码信息,但会保留用户名称)  
-->AbstractRememberMeServices :判断请求参数中是否包含_spring_security_remember_me参数,如果包含并且值为(true,on,yes,1)中的任意一个,则将用户名和密码信息保存进cookie,否则不做处理  
-->AccessDecisionManager :由其决定是否放行  
  
之后在请求被保护的资源时,RememberMeAuthenticationFilter会先判断是否Authentication已经失效,如果失效,则试图从cookie中寻找,找到则重新封装Authentication。

问题就出在ProviderManager中,其布尔属性eraseCredentialsAfterAuthentication默认值为true,如果为true则会在username和password验证成功后清除掉Authentication中的password信息,而AbstractRememberMeServices 保存cookie的条件则需要从Authentication中同时取得username和password,这就导致默认情况下AbstractRememberMeServices永远不会将username和password存储到cookie中,所以,为了保证username和password可以被正确的存储到cookie中,我们需要修改eraseCredentialsAfterAuthentication的值为false,好在修改这个属性很方便,如下:

<authentication-manager erase-credentials="false">  
        <authentication-provider user-service-ref="userService">  
            <password-encoder hash="md5" />  
        </authentication-provider>  
</authentication-manager>

<remember-me  token-validity-seconds="123456789"/>


转载于:https://my.oschina.net/fir01/blog/68926

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值