セッション管理の移行
次の手順は、セッション管理サポートの移行を完了する方法に関連しています。
SecurityContextRepository の明示的な保存が必要
Spring Security 5 のデフォルトの動作は、SecurityContextPersistenceFilter
を使用して SecurityContext
が SecurityContextRepository
に自動的に保存されることです。保存は、HttpServletResponse
がコミットされる直前、および SecurityContextPersistenceFilter
の直前に行う必要があります。残念ながら、SecurityContext
の自動永続化は、リクエストが完了する前 (つまり、HttpServletResponse
をコミットする直前) に行われると、ユーザーを驚かせる可能性があります。また、状態を追跡して保存が必要かどうかを判断するのも複雑で、SecurityContextRepository
(つまり HttpSession
) への不必要な書き込みが発生することがあります。
Spring Security 6 のデフォルトの動作は、SecurityContextHolderFilter
が SecurityContextRepository
から SecurityContext
のみを読み取り、それを SecurityContextHolder
に入力することです。リクエスト間で SecurityContext
を保持したい場合、ユーザーは SecurityContext
を SecurityContextRepository
と共に明示的に保存する必要があります。これにより、必要な場合にのみ SecurityContextRepository
(つまり HttpSession
) への書き込みが必要になるため、あいまいさがなくなり、パフォーマンスが向上します。
ログアウト時など、コンテキストをクリアするときにもコンテキストを保存する必要があります。詳細については、このセクションを参照してください。 |
Spring Security 6 の新しいデフォルトを明示的に選択している場合は、次の構成を削除して Spring Security 6 のデフォルトを受け入れることができます。
Java
Kotlin
XML
public SecurityFilterChain filterChain(HttpSecurity http) {
http
// ...
.securityContext((securityContext) -> securityContext
.requireExplicitSave(true)
);
return http.build();
}
@Bean
open fun springSecurity(http: HttpSecurity): SecurityFilterChain {
http {
securityContext {
requireExplicitSave = true
}
}
return http.build()
}
<http security-context-explicit-save="true">
<!-- ... -->
</http>
構成を使用する際、SecurityContextHolder
を SecurityContext
で設定するコードは、リクエスト間で永続化する必要がある場合、SecurityContext
を SecurityContextRepository
に保存することも重要です。
例: 次のコード:
SecurityContextPersistenceFilter
で SecurityContextHolder
を設定する Java
Kotlin
SecurityContextHolder.setContext(securityContext);
SecurityContextHolder.setContext(securityContext)
次に置き換える必要があります
SecurityContextHolderFilter
で SecurityContextHolder
を設定する Java
Kotlin
SecurityContextHolder.setContext(securityContext);
securityContextRepository.saveContext(securityContext, httpServletRequest, httpServletResponse);
SecurityContextHolder.setContext(securityContext)
securityContextRepository.saveContext(securityContext, httpServletRequest, httpServletResponse)
複数の SecurityContextRepository
Spring Security 5 では、デフォルトの SecurityContextRepository
は HttpSessionSecurityContextRepository
でした。
Spring Security 6 では、デフォルトの SecurityContextRepository
は DelegatingSecurityContextRepository
です。6.0 への更新のみを目的として SecurityContextRepository
を構成した場合は、完全に削除できます。
RequestCache
のクエリを最適化する
Spring Security 5 では、デフォルトの動作は、リクエストごとに保存されたリクエストを照会することです。これは、通常のセットアップでは、RequestCache
を使用するために、リクエストごとに HttpSession
が照会されることを意味します。
Spring Security 6 では、デフォルトでは、HTTP パラメーター continue
が定義されている場合にのみ、RequestCache
がキャッシュされたリクエストに対してクエリされます。これにより、Spring Security が RequestCache
で HttpSession
を不必要に読み取ることを回避できます。
Spring Security 5 では、デフォルトで HttpSessionRequestCache
が使用され、リクエストごとにキャッシュされたリクエストが照会されます。デフォルトをオーバーライドしない場合 (つまり、NullRequestCache
を使用する場合)、次の構成を使用して、Spring Security 5.8 で Spring Security 6 の動作を明示的に選択できます。
continue
パラメーターが存在する場合、RequestCache
は保存されたリクエストのみをチェックします Java
Kotlin
XML
@Bean
DefaultSecurityFilterChain springSecurity(HttpSecurity http) throws Exception {
HttpSessionRequestCache requestCache = new HttpSessionRequestCache();
requestCache.setMatchingRequestParameterName("continue");
http
// ...
.requestCache((cache) -> cache
.requestCache(requestCache)
);
return http.build();
}
@Bean
open fun springSecurity(http: HttpSecurity): SecurityFilterChain {
val httpRequestCache = HttpSessionRequestCache()
httpRequestCache.setMatchingRequestParameterName("continue")
http {
requestCache {
requestCache = httpRequestCache
}
}
return http.build()
}
<http auto-config="true">
<!-- ... -->
<request-cache ref="requestCache"/>
</http>
<b:bean id="requestCache" class="org.springframework.security.web.savedrequest.HttpSessionRequestCache"
p:matchingRequestParameterName="continue"/>