博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringSecurity3.X--remember-me
阅读量:5998 次
发布时间:2019-06-20

本文共 2174 字,大约阅读时间需要 7 分钟。

hot3.png

http://blog.sina.com.cn/s/blog_8020e411010155lf.html

SpringSecurity3.X--remember-me

 
03225720_hbYY.gif
03225720_hbYY.gif (2012-04-20 15:03:14)
03225720_hbYY.gif转载▼
标签: 

分类: 

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

Java代码 " quality="high" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> 
  1. <input id="_spring_security_remember_me" name="_spring_security_remember_me" type="checkbox" value="true"/>  
 

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

 

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

Xml代码  
  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,好在修改这个属性很方便,如下:

Xml代码  " quality="high" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> 
  1. <authentication-manager erase-credentials="false">  
  2.         <authentication-provider user-service-ref="userService">  
  3.             <password-encoder hash="md5" />  
  4.         </authentication-provider>  
  5. </authentication-manager>  
     

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

 

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

Xml代码 " quality="high" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> 
  1. <remember-me  token-validity-seconds="123456789"/>  
 

 

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

转载于:https://my.oschina.net/u/1045177/blog/525534

你可能感兴趣的文章
Error: Debug Failure at typeToString
查看>>
JS面向对象的程序设计之继承的实现-组合继承
查看>>
nwjs ffi dll调用实现方案
查看>>
使用数据流引擎进行大型矩阵操作
查看>>
数字金额转写为中文大写
查看>>
结合Ant Design2.x总结在实际项目开发中遇到的问题
查看>>
10分钟理解JS引擎的执行机制
查看>>
Android 软键盘的显示和隐藏,这样操作就对了
查看>>
javaWeb开发实现多图上传和调用C++Deeplearning算法进行图片对比检测
查看>>
007-读书笔记-Vue官网 插件
查看>>
Web开发中,什么级别才算是高并发
查看>>
Eclipse 中使用egit插件与github交互
查看>>
如何理解Vue的非prop属性
查看>>
创建前端平移动画为何 translate() 优于 top/right/bottom/left
查看>>
Ubuntu安装MySQL
查看>>
vuex 学习记录
查看>>
c++的输入输出 [三](istringstream,ostringstream,stringstream)
查看>>
express+mongoose 实现简易后台数据接口
查看>>
20170615-Ajax和XMLHttpRequest
查看>>
解压即用 MySQL 使用指南(Windows)
查看>>