Spring Security实现自动登录的基本流程是,在第一次登录成功时将相关用户凭证及相关自动登录所需信息保存起来,在下次未登录访问受限资源时,会从中取出相关信息进行验证来实现自动登录的效果。
Spring Security除了提供将用户凭证信息存储在Cookie以便下次登录时进行自动登录的方式外,还支持将相关用户凭证信息及自动登录所需信息存储在持久化存储中的方式,这里的持久化存储可以在内存中,可以在外部文件中,也可以在数据库中,实现不同方式的持久化存储都需要实现PersistentTokenRepository接口,里面定义了创建凭证,删除凭证,修改凭证的相关方法,默认的RememberMeServices中使用的是InMemoryTokenRepository类,这个类的作用是将自动登录相关信息放置在内存中。
在这里我使用数据库存储自动登录相关用户凭证及相关信息的方式,不需要任何的代码,只需要进行简单的配置就可达到这样的效果,因为Spring Security已经为我们提供了这样的类,类名为JdbcTokenRepositoryImpl, 查看该类的源码会发现,该类包含了创建持久化登录信息的表语句,还有插入,修改,删除语句。
<beans:bean id="rememberMeServices" class="org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices"> <beans:property name="key" value="ZhongGang"/> <beans:property name="parameter" value="rememberMe"/> <beans:property name="cookieName" value="rememberMe"/> <beans:property name="userDetailsService" ref="userService"/> <beans:property name="tokenRepository" ref="tokenRepository"/> </beans:bean> <beans:bean id="tokenRepository" class="org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl"> <beans:property name="createTableOnStartup" value="true"/> <beans:property name="dataSource" ref="dataSource"/> </beans:bean>
tokenRepository bean这里定义的是数据库存储的方式,如果不在rememberMeServices中设置tokenRepository,那么默认使用的内在的存储方式,也就是默认实现的是InMemoryTokenRepositoryImpl类, 其它属性的设置和之前的基于Cookie的自动登录方式一样,当然还有其它诸如凭证的有效期限等设置值,这根据需求的不同而有所不同。
这是建表相关语句
create table persistent_logins (username varchar(64) not null, series varchar(64) primary key, " +
"token varchar(64) not null, last_used timestamp not null)
这些语句都可以在JdbcTokenRepositoryImpl源码中发现, 因为Spring Security没有为这些语句提供设置方法, 所以如果想要使用自己的表和增删改查语句,需要继承这个类自己添加方法。
这里除了tokentRepository和rememberMeServices的设置不同外,其它部分和前一章的没有不同之处。