Spring Security 集成

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

Spring Security Remember-me 支持

Spring Session 提供了与 Spring Security 的 Remember-me 认证的集成。支持

  • 更改会话过期时长

  • 确保会话 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;
}

基于 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"/>

Spring Security 并发会话控制

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

当使用 Spring Security 的 Java config 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);
	}

}

这假设您还配置了 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>

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

限制

Spring Session 的 Spring Security 的 SessionRegistry 接口实现不支持 getAllPrincipals 方法,因为无法使用 Spring Session 检索此信息。Spring Security 永远不会调用此方法,因此这只会影响访问 SessionRegistry 本身的应用程序。