Spring-Security3中的RememberMe功能的引入
RememberMe的功能实现有三种,这里只讲TokenBasedRememberMeServices的实现方案配置。
1. Authentication-Manager配置中加上erase-credentials="false"这个属性配置。
不过阅读源码的时候发现如果没有也不要紧,只是会去读数据库,重新获得用户的密码而已。但从整个过程来看,好像也没并没有多读一次数据库。这部分代码的理顺就不包含在这里了。只要知道一点就好:这个配置不是必要的。
<authentication-manager erase-credentials="false"
2. http中加上remember-me的配置
这个配置在logout和anonymous之前即可。
里面有几个属性配置:
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-ref和token-repository-ref两种,分别使用JdbcTokenRepositoryImpl和PersistentTokenBasedRememberServices来实现,并且这两个不能同时配置,都不用的话就用TokenBasedRememberMeServices来进行配置。这两种实现方案暂时没有研究。
---------------------------------------------
如果采用自己定义http的entry-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了,就这样。