6、Spring Security集成
Spring Session提供了和Spring Security的集成。
6.1. Spring Security Remember-Me的支持
Spring Session 提供了和 Spring Security’s Remember-Me Authentication(https://docs.spring.io/spring-security/site/docs/4.2.x/reference/htmlsingle/#remember-me)的支持。这个支持将会带来:
- 改变会话过期长度
- 确保会话的Cookie过期时限为Integer.MAX_VALUE。Cookie过期设置为最大的可能值是因为cookie是在会话创建的时候设置。如果它被设置成和session过期一样的话,当用户使用session时session可以更新,但是cookie过期之后不会更新,从而将会导致过期而被限定。
使用Java配置Spring Session和Spring Security参考如下:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// ... additional configuration ...
.rememberMe()
.rememberMeServices(rememberMeServices());
}
@Bean
RememberMeServices rememberMeServices() {
SpringSessionRememberMeServices rememberMeServices =
new SpringSessionRememberMeServices();
// optionally customize
rememberMeServices.setAlwaysRemember(true);
return rememberMeServices;
}
基于XML配置如下:
<security:http>
<!-- ... -->
<security:form-login />
<security:remember-me services-ref="rememberMeServices"/>
</security:http>
<bean id="rememberMeServices"
class="org.springframework.session.security.web.authentication.SpringSessionRememberMeServices" p:alwaysRemember="true"/>
6.2. Spring Security并发会话控制
Spring Session提供了和Spring Security的整合支持并发会话控制。这允许限制单个用户可以并发的活跃会话数量。但是这和默认Spring Security支持的不同,这个可以在集群环境中使用。它是通过提供Spring Security的SessionRegistry接口的一个个性化实现来完成的。
当我们使用Spring Security Java配置DSL时,你可以就像下面一样通过SessionManagementConfigurer来配置个性化的SessionRegistry。
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private FindByIndexNameSessionRepository<Session> sessionRepository;
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
// other config goes here...
.sessionManagement()
.maximumSessions(2)
.sessionRegistry(sessionRegistry());
// @formatter:on
}
@Bean
SpringSessionBackedSessionRegistry sessionRegistry() {
return new SpringSessionBackedSessionRegistry<>(this.sessionRepository);
}
}
这里假设你已经配置了Spring Session并提供了一个FindByIndexNameSessionRepository返回Session实例。
使用XML配置如下:
<security:http>
<!-- other config goes here... -->
<security:session-management>
<security:concurrency-control max-sessions="2" session-registry-ref="sessionRegistry"/>
</security:session-management>
</security:http>
<bean id="sessionRegistry"
class="org.springframework.session.security.SpringSessionBackedSessionRegistry">
<constructor-arg ref="sessionRepository"/>
</bean>
这里假设称为sessionRegistry是你的Spring Session SessionRegistry,这个名称将会被所有的SpringHttpSessionConfiguration的子类所使用。
6.3. 局限性
Spring Security’s SessionRegistry接口的Spring Session实现不支持getAllPrincipals方法,因此这些信息就不能使用Spring Session获取。这个方法也不会被Spring Security调用,因此这仅仅影响那些访问SessionRegistry 自己的应用。
原文:https://docs.spring.io/spring-session/docs/2.0.0.M4/reference/html5/#spring-security