# Spring 安全集成
Spring Session 提供了具有 Spring 安全性的集成。
# Spring 安全 Remember-Me 支持
Spring Session 提供了与Spring Security’s Remember-me Authentication (opens new window)的集成。支持:
更改会话过期长度
确保会话 cookie 在
Integer.MAX_VALUE
处过期。cookie 过期时间被设置为可能的最大值,因为只有在创建会话时才设置 cookie 过期时间。如果将其设置为与会话到期日相同的值,则会话将在用户使用会话时获得更新,但不会更新 cookie 到期日(导致过期时间固定)。
要在 Java 配置中配置具有 Spring 安全性的 Spring Session ,可以使用以下清单作为指导:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// ... additional configuration ...
.rememberMe((rememberMe) -> 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"/>
# Spring 安全并发会话控制
Spring Session 提供与 Spring 安全性的集成,以支持其并发的会话控制。这允许限制单个用户可以并发的活动会话的数量,但是,与默认的 Spring 安全支持不同,这也适用于集群环境。这是通过提供 Spring Security 的SessionRegistry
接口的自定义实现来完成的。
当使用 Spring Security 的 Java Config DSL 时,你可以通过SessionManagementConfigurer
配置自定义SessionRegistry
,如下所示:
@Configuration
public class SecurityConfiguration<S extends Session> extends WebSecurityConfigurerAdapter {
@Autowired
private FindByIndexNameSessionRepository<S> sessionRepository;
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
// other config goes here...
.sessionManagement((sessionManagement) -> sessionManagement
.maximumSessions(2)
.sessionRegistry(sessionRegistry())
);
// @formatter:on
}
@Bean
public SpringSessionBackedSessionRegistry<S> 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
子类使用的名称。
# 限制
Spring session 的 Spring security 的SessionRegistry
接口的实现不支持getAllPrincipals
方法,因为无法通过使用 Spring session 来检索此信息。 Spring Security 从不调用此方法,因此这只会影响访问SessionRegistry
本身的应用程序。
← WebSession 集成 API 文档 →