Spring Security 統合

Spring Session は Spring Security との統合を提供します。

Spring Security リメンバーミーサポート

Spring Session は Spring Security の Remember-me 認証との統合を提供します。サポート:

  • セッションの有効期限の長さを変更します

  • セッション Cookie が Integer.MAX_VALUE で期限切れになることを確認します。Cookie はセッションの作成時にのみ設定されるため、Cookie の有効期限は可能な限り最大の値に設定されます。セッションの有効期限と同じ値に設定されている場合、ユーザーが使用したときにセッションが更新されますが、Cookie の有効期限は更新されません(有効期限が修正されるため)。

Java 構成で Spring Security を使用して Spring Session を構成するには、以下のリストをガイドとして使用できます。

@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 との統合を提供して、同時セッション制御をサポートします。これにより、1 人のユーザーが同時に持つことができるアクティブなセッションの数を制限できますが、デフォルトの Spring Security サポートとは異なり、これはクラスター環境でも機能します。これは、Spring Security の SessionRegistry インターフェースのカスタム実装を提供することによって行われます。

Spring Security の Javaconfig 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);
	}

}

これは、Session インスタンスを返す FindByIndexNameSessionRepository を提供するように Spring 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 インターフェースの実装は、Spring Session を使用してこの情報を取得できないため、getAllPrincipals メソッドをサポートしていません。このメソッドは Spring Security によって呼び出されることはないため、これは SessionRegistry 自体にアクセスするアプリケーションにのみ影響します。