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的应用程序。