对于最新稳定版本,请使用 Spring Session 4.0.2spring-doc.cadn.net.cn

Spring Security 集成

Spring Session 提供了与 Spring Security 的集成。spring-doc.cadn.net.cn

Spring Security 记住我支持

Spring Session 提供了与 Spring Security 的Remember-me认证集成。 支持如下所述:spring-doc.cadn.net.cn

  • 更改会话过期长度spring-doc.cadn.net.cn

  • 确保会话cookie在Integer.MAX_VALUE时过期。 cookie的过期时间被设置为最大的可能值,因为cookie仅在会话创建时设置。 如果将其设置为与会话过期相同的时间,则当用户使用该会话时,会话会被更新但cookie过期不会更新(导致过期固定)。spring-doc.cadn.net.cn

要使用Java配置将Spring Session与Spring Security 配置在一起,您可以参考以下列表作为指导:spring-doc.cadn.net.cn

@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的配置可能会如下所示:spring-doc.cadn.net.cn

<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 的 HttpSessionEventPublisher 接口来完成的。spring-doc.cadn.net.cn

当使用Spring Security的Java配置DSL时,您可以通过SessionManagementConfigurer来配置自定义的SessionRegistry,如以下列表所示:spring-doc.cadn.net.cn

@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来提供一个FindByIndexNameSessionRepository,它返回Session实例。spring-doc.cadn.net.cn

当使用XML配置时,它看起来类似于以下示例:<br/>spring-doc.cadn.net.cn

<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-doc.cadn.net.cn

限制

Spring Session 对 Spring Security 的 SessionRegistry 接口的实现不支持 getAllPrincipals 方法,因为通过 Spring Session 无法获取这些信息。此方法从未被 Spring Security 调用,因此只会影响那些直接访问 SessionRegistry 的应用程序。spring-doc.cadn.net.cn