SpringSecurity3.X--remember-me

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

SpringSecurity3.X--remember-me

(2012-04-20 15:03:14)

转载▼

标签:

it

分类: javaEE

在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. 之后在请求被保护的资源时,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要这样处理,也许是我还没搞清楚缘由,希望与各位讨论。

http://hanqunfeng.iteye.com/blog/1157022

时间: 2024-08-08 20:35:51

SpringSecurity3.X--remember-me的相关文章

SpringSecurity3.X权限原理(转)

  这里给出一个简单的安全验证的实现例子,先说一下需求: 1.通过登录页面进行登录 2.用户登录前访问被保护的地址时自动跳转到登录页面 3.用户信息存储在数据表中 4.用户权限信息存在在数据表中 5.用户登录成功后访问没有权限访问的地址时跳转到登录页面 ok,以上就是一个基本的需求了,大部分的系统都是基于该需求实现登录模块的. 给出实现之前,先简单说明一下springsecurity的原理, 1.AccessDecisionManager 和我们一般实现登录验证采用filter的方式一样,spr

蓝缘管理系统第二个版本开源了。springMVC+springSecurity3.x+Mybaits3.x 系统

蓝缘管理系统第二个版本开源了 继于 http://blog.csdn.net/mmm333zzz/article/details/16863543 版本一.版本二 对springMVC+springSecurity3.x+Mybaits3.x的权限系统 进行很多优化方面,继续进行开源,. 预览地址:http://www.lanoss.com      多谢群友们的支持,该网站是用到啊里云服务+香港主机,希望大家继续支持捐 助!群主支付账号 [email protected] 捐助时,记得备注!谢

SpringSecurity3.2.5自定义角色及权限的教程

最近阴差阳错的搞上了SpringSecurity3,因为是自己做的小系统,中间遇到了很多坑,基本每个坑都踩过了,网上也查了不少资料,发现有不少错误的,更是让我绕了一圈又一圈,现在把一些基本的东西总结一下. 先从整体上总结一下为什么使用SS,一般的,在不使用ss的情况下,我们基本会在每个业务方法执行前,插入一段用于验证权限的代码,从而判断当前用户是否有相应权限进行操作,这样做就会让业务方法和验证权限有了一个紧密的耦合:如果使用ss,我们就可以通过注解或者XML配置方式代替权限验证,使得业务和权限代

主题:基于springMVC+springSecurity3.x+Mybaits3.x的权限系统,,

在平时的空闲时,自己做了一个权限管理系统,细粒度控制,支持控制到按扭!支持开源!分享知识! 很久之前就想把自己所学到的知识以及项目所用的技术集结起来,之前太忙了,一直没有动手做,这段时间有点闲,就把一个系统的基本要素功能做了出来,发现自己又懂得很多!其中也遇到不少困难和问题,但最终还是一一解决了!经验就是这样得来的!哈哈!我的博客有很多文章都是在项目中遇到问题以及解决办法写下来的!写得不好不要喷口水哈!如果觉得好的就 赞一下!谢谢! 以下的作品都是自己呕心沥血做出来的,源码中有很多注释,都是自己

springsecurity3实现的过程

1.在类初始化的时候,InvocationSecurityMetadataSource类就会调用loadResourceDefine()的方法,取到所用的资源对应的角色关系.(这个步骤是在tomcat容器启动的时候调用的) 2.当用户访问某个资源时,提交的url就会被我们自定义的过滤器(MyFilterSecurityInterceptor) 拦截,进入doFilter()的方法,在调用该方法前,会执行InterceptorStatusToken token = super.beforeInvo

使用SpringSecurity3用户验证(异常信息,验证码)

1. 自定义user-service后,封装自定义异常信息返回 通常情况下,抛UsernameNotFoundException异常信息是捕捉不了,跟踪源码后发现 Java代码   try { user = retrieveUser(username, (UsernamePasswordAuthenticationToken) authentication); } catch (UsernameNotFoundException notFound) { logger.debug("User '&

S - 使用SpringSecurity3用户验证几点体会(异常信息,验证码)

1. 自定义user-service后,封装自定义异常信息返回 通常情况下,抛UsernameNotFoundException异常信息是捕捉不了,跟踪源码后发现 Java代码   try { user = retrieveUser(username, (UsernamePasswordAuthenticationToken) authentication); } catch (UsernameNotFoundException notFound) { logger.debug("User '&

使用SpringSecurity3实现RBAC权限管理

1. What? 什么是权限管理? 具体可参见百度:http://baike.baidu.com/view/2108713.htm 名词备注: 数据级权限:百科内的权限管理一文解释的比较不错,但其中的"数据级权限"有的人看来会觉得有点摸不着头脑.数据级权限,即表示权限与特定数据有联系的权限,比方说,某用户只能创建100个用户.这个100,就是数据级权限的一个指标. 2. How?怎么样实现权限管理? 2.1.一种烦恼 也许很多程序员会在权限管理中遇到这样的一个问题. 大部分项目都需要权

Springsecurity3.1.3配置多个登陆页面

需求:网站的前台和后台不同的url需要不同的登陆页面,不同的异常捕获方式. spring-security3.1以后的版本支持多个<http>标签,因此本文所采用的方式就是使用两个,实际上是三个<http>标签实现上述功能(为什么是是要三个将会在下面加以说明) spring-security.xml配置如下 <!-- 后台管理 --> <http pattern="/admin/**" authentication-manager-ref=&q