SpringSecurity3.X的remember-me

2014-11-24 08:54:18 · 作者: · 浏览: 0

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


1


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


1 UsernamePasswordAuthenticationFilter :获得用户提交的用户名和密码信息

2 -->UserDetailsService :由其封装用户对象

3 -->AbstractUserDetailsAuthenticationProvider :转由其进行密码和权限验证,验证通过后封装一个Authentication

4 -->ProviderManager:会将Authentication封装到SecurityContext中(默认情况下,ProviderManager会在认证成功后清除掉Authentication的密码信息,但会保留用户名称)

5 -->AbstractRememberMeServices :判断请求参数中是否包含_spring_security_remember_me参数,如果包含并且值为(true,on,yes,1)中的任意一个,则将用户名和密码信息保存进cookie,否则不做处理

6 -->AccessDecisionManager :由其决定是否放行

7

8 之后在请求被保护的资源时,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,好在修改这个属性很方便,如下:


1

2

3

4

5


1