On this page
8. Spring Security 集成
Spring Session 提供与 Spring Security 的集成。
8.1 Spring Security 记住我支持
Spring Session 提供与Spring Security 的“记住我”身份验证的集成。支持将:
更改会话过期时间
确保会话 cookie 在
Integer.MAX_VALUE
过期。 cookie 过期设置为最大可能值,因为仅在创建会话时才设置 cookie。如果将其设置为与会话到期相同的值,则会话将在用户使用会话时进行更新,但 cookie 到期将不会更新,导致到期被固定。
要在 Java Configuration 中使用 Spring Security 配置 Spring Session,请使用以下指南:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// ... additional configuration ...
.rememberMe()
.rememberMeServices(rememberMeServices());
}
@Bean
public SpringSessionRememberMeServices 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"/>
8.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>
假设您的 Spring Session SessionRegistry
bean 名为sessionRegistry
,这是所有SpringHttpSessionConfiguration
子类使用的名称。
8.3 Limitations
Spring Session 的 Spring Security 的SessionRegistry
接口实现不支持getAllPrincipals
方法,因为无法使用 Spring Session 检索此信息。 Spring Security 从不调用此方法,因此这只会影响自己访问SessionRegistry
的应用程序。