Spring-Security3中的RememberMe功能的引入 RememberMe的功
Spring-Security3中的RememberMe功能的引入 RememberMe的功
于忠达 发表于4年前
Spring-Security3中的RememberMe功能的引入 RememberMe的功
  • 发表于 4年前
  • 阅读 100
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: Spring-Security3的RememberMe功能实现并不复杂,这里给出3种配置中的一种,是已经验证过的,留此文章以作纪念。

Spring-Security3中的RememberMe功能的引入

 

RememberMe的功能实现有三种,这里只讲TokenBasedRememberMeServices的实现方案配置。

 

1. Authentication-Manager配置中加上erase-credentials="false"这个属性配置。

不过阅读源码的时候发现如果没有也不要紧,只是会去读数据库,重新获得用户的密码而已。但从整个过程来看,好像也没并没有多读一次数据库。这部分代码的理顺就不包含在这里了。只要知道一点就好:这个配置不是必要的。

    <authentication-manager erase-credentials="false"

 

2. http中加上remember-me的配置

这个配置在logoutanonymous之前即可。

里面有几个属性配置:

user-service-ref指向authentication-manager里面provider当中配置的user-service-ref即可。用来获取用户的时候用。

token-validity-seconds:这个不用解释了吧,就是记住用户多长时间。我不知道怎样可以实现动态的记住,比如用户可选一天/一周/一月/一年等。单位是秒。

authentication-success-handler-ref:这个是认证通过之后的后续处理。如果不需要,这个可以不配置。我是需要的。

       <sec:remember-me

              user-service-ref="userService"

              token-validity-seconds="2592000"

              authentication-success-handler-ref="loginSuccessHandler"/>

 

3. 前端页面

前端页面的登录表单里面增加一个记住我的复选框即可。字段的值可以是true/on/1等多种表达确定使用该功能的方式。

<input name="_spring_security_remember_me" type="checkbox" value="true"/>

 

OK了。这样的配置已经完美的引入了RememberMe功能了。不过由于这个方案使用的是内存存储方式,TokenBasedRememberMeServices把已经登录的人员信息放在内存里,因此关机之后就不能用了。如果要使用持久化到数据库,需要另行配置,方式也差不多。

 

另外的实现方案包括配置data-source-reftoken-repository-ref两种,分别使用JdbcTokenRepositoryImplPersistentTokenBasedRememberServices来实现,并且这两个不能同时配置,都不用的话就用TokenBasedRememberMeServices来进行配置。这两种实现方案暂时没有研究。

 

---------------------------------------------

 

如果采用自己定义httpentry-point的话,即实现了自己的登录方式,比如添加了验证码的校验,这时候加入RememberMe的配置稍微有点不一样。

1. Authentication-Manager配置中加上erase-credentials="false"这个属性配置。

这个配置和前面的一样,可以不配置,照样工作很好。我也是参照别人的配置进行的,后来自己读源码发现不需要这个配置。

2. http中加上remember-me的配置

这个配置基本上不变,但需要添加一个属性,开放出所配置的RememberMeServices来。因为开放的这个Bean要被配置在别的地方

    <sec:remember-me

       services-alias="tokenBasedRememberMeServices"

       user-service-ref="userService"

       token-validity-seconds="2592000"

       authentication-success-handler-ref="loginSuccessHandler"/>

 

3. 自定义登录的AuthenticationProcessingFilter中添加对RememberMeServices的引用

对我来说,这个地方的代码应该是这个样子的:

    <bean id="captchaAuthenticationFilter"

       class="com.xx.CaptchaUsernamePasswordAuthenticationFilter">

       <property name="authenticationFailureHandler"

            ref="loginFailureHandler" />

       <property name="authenticationSuccessHandler"

            ref="loginSuccessHandler" />

       <property name="authenticationManager"

            ref="authenticationManager" />

       <property name="rememberMeServices"

            ref="tokenBasedRememberMeServices" />

       <property name="filterProcessesUrl"

            value="/workspace/dologin" />

       <property name="authCode" ref="authCode" />

    </bean>

 

4. 前端页面

前端页面跟前面是一样的。

 

OK了,就这样。


共有 人打赏支持
粉丝 101
博文 12
码字总数 15203
×
于忠达
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: