SpringSecurity3.X--remember-me
来源:互联网 发布:手机淘宝申请开店 编辑:程序博客网 时间:2024/05/12 12:44
目录
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要这样处理,也许是我还没搞清楚缘由,希望与各位讨论。
- SpringSecurity3.X--remember-me
- Remember me
- Remember me
- PHP remember me
- spring security remember-me
- Shiro的Remember Me
- Remember-Me功能
- SpringSecurity3.X--验证码
- Spring Seucrity 之 Remember Me
- Apache Shiro 的Remember Me
- Apache Shiro Remember Me服务
- Spring Seucrity 之 Remember Me
- 求教spring security remember me
- spring security4 之 remember-me
- Spring Security Remember Me Example
- 更安全地实现remember me
- 6.CAS增加Remember me
- apache shiro remember me 不起作用
- 对象池
- java学习总结——第四天(上)
- 软件工程文档目标读者
- HDU 2177 取(2堆)石子游戏
- StringBuilder与StringBuffer的区别(转)
- SpringSecurity3.X--remember-me
- 图着色
- 进程与线程的比较
- 从MyEclipse到IntelliJ IDEA
- 本地开发调试微信公众平台方法——路由器端口映射+花生壳动态域名解析
- PrepareStatement与Statement之间的区别
- JUnit测试骨架
- Spring 使用注解方式进行事务管理
- Hibernate中inverse="true"的理解