`
hanqunfeng
  • 浏览: 1526232 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SpringSecurity3.X--remember-me

阅读更多

目录

SpringSecurity3.X--一个简单实现

SpringSecurity3.X--前台与后台登录认证

SpringSecurity3.X--remember-me

SpringSecurity3.X--验证码

 

该问题已经在新版本中修复!!!!

 

笔者在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"/>

 

看上去挺简单的,可是笔者测试后发现并未起作用,google了一下,也未见有人提起过该问题,于是乎翻出源码一探究竟,果然发现了问题。

 

这里先简要说明一下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>

     

 增加该配置后,则cookie信息被成功保存。

 

 默认情况下,cookie的有效期为两个星期,如果希望修改这个有效期,可以在<remember-me />中进行配置:

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

 

 

不知道为什么ProviderManager要这样处理,也许是我还没搞清楚缘由,希望与各位讨论。

 

该问题已经在新版本中修复!!!!

分享到:
评论
5 楼 adslkl 2014-10-09  
我使用的是版本是3.0.5<authentication-manager>标签里没有erase-credentials="false"这个属性 求大神指点。
4 楼 threejin520 2013-12-11  
属性不存在啊,楼主给点意见!
3 楼 bingfengfzl 2012-08-01  
兄弟可以发个demo给我吗?我免登陆那里老是不行bingfengfzl@163.com
2 楼 kjj 2011-10-31  
<authentication-manager erase-credentials="false"> 

启动报错,属性不存在这个标签里!!
1 楼 threejin520 2011-09-21  
受教了,这个还真没仔细看过!

相关推荐

Global site tag (gtag.js) - Google Analytics