跳到主要内容

Spring Security 集成

QWen Max 中英对照 Spring Security Integration

Spring Session 提供了与 Spring Security 的集成。

Spring Security 记住我支持

Spring Session 提供了与 Spring Security 的记住我身份验证 的集成。该支持:

  • 更改会话到期时长

  • 确保会话 cookie 在 Integer.MAX_VALUE 时到期。cookie 到期时间被设置为可能的最大值,因为只有在创建会话时才会设置 cookie。如果将其设置为与会话到期时间相同的值,则当用户使用会话时,会话将被更新,但 cookie 到期时间不会被更新(导致到期时间固定不变)。

要使用 Java 配置将 Spring Session 与 Spring Security 进行配置,可以参考以下示例:

@Bean
SecurityFilterChain securityFilterChain(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;
}
java

基于 XML 的配置如下所示:

<security:http>
<!-- ... -->
<security:form-login />
<security:remember-me services-ref="rememberMeServices"/>
<security:intercept-url pattern="/**" access="permitAll()"/>
</security:http>

<bean id="rememberMeServices"
class="org.springframework.session.security.web.authentication.SpringSessionRememberMeServices"
p:alwaysRemember="true"/>
xml

Spring Security 并发会话控制

Spring Session 提供了与 Spring Security 的集成,以支持其并发会话控制。这允许限制单个用户可以同时拥有的活动会话数量,但与默认的 Spring Security 支持不同,这在集群环境中也可以工作。这是通过提供 Spring Security 的 SessionRegistry 接口的自定义实现来完成的。

在使用 Spring Security 的 Java 配置 DSL 时,你可以通过 SessionManagementConfigurer 配置自定义的 SessionRegistry,如下所示:

@Configuration
public class SecurityConfiguration<S extends Session> {

@Autowired
private FindByIndexNameSessionRepository<S> sessionRepository;

@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
// other config goes here...
.sessionManagement((sessionManagement) -> sessionManagement
.maximumSessions(2)
.sessionRegistry(sessionRegistry())
)
.build();
}

@Bean
public SpringSessionBackedSessionRegistry<S> sessionRegistry() {
return new SpringSessionBackedSessionRegistry<>(this.sessionRepository);
}

}
java

这假设你已经配置了 Spring Session 来提供一个返回 Session 实例的 FindByIndexNameSessionRepository

当使用 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>
xml

这假设你的 Spring Session SessionRegistry bean 被称为 sessionRegistry,这是所有 SpringHttpSessionConfiguration 子类使用的名称。

限制

Spring Session 对 Spring Security 的 SessionRegistry 接口的实现不支持 getAllPrincipals 方法,因为无法通过使用 Spring Session 来检索此信息。Spring Security 从未调用过此方法,因此这仅影响直接访问 SessionRegistry 的应用程序。