Spring Security 整合

Spring Session 提供與 Spring Security 的整合。

Spring Security 記住我支援

Spring Session 提供與 Spring Security 的「記住我」驗證 的整合。此支援

  • 變更 session 到期時間長度

  • 確保 session cookie 在 Integer.MAX_VALUE 到期。Cookie 到期時間設定為最大可能值,因為 cookie 僅在 session 建立時設定。如果設定為與 session 到期時間相同的值,則當使用者使用 session 時會續訂 session,但 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 並行 Session 控制

Spring Session 提供與 Spring Security 的整合,以支援其並行 session 控制。這允許限制單一使用者可以同時擁有的活動 session 數量,但是,與預設的 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);
	}

}

這假設您也已設定 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 本身的應用程式。