SessionManagementFilterがこれを処理すると思います:
if (!securityContextRepository.containsContext(request)) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && !authenticationTrustResolver.isAnonymous(authentication)) {
// The user has been authenticated during the current request, so call the session strategy
try {
sessionAuthenticationStrategy.onAuthentication(authentication, request, response);
} catch (SessionAuthenticationException e) {
// The session strategy can reject the authentication
logger.debug("SessionAuthenticationStrategy rejected the authentication object", e);
SecurityContextHolder.clearContext();
failureHandler.onAuthenticationFailure(request, response, e);
return;
}
// Eagerly save the security context to make it available for any possible re-entrant
// requests which may occur before the current request completes. SEC-1396.
securityContextRepository.saveContext(SecurityContextHolder.getContext(), request, response);
} else {
// No security context or authentication present. Check for a session timeout
if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) {
if(logger.isDebugEnabled()) {
logger.debug("Requested session ID " + request.getRequestedSessionId() + " is invalid.");
}
if (invalidSessionStrategy != null) {
invalidSessionStrategy.onInvalidSessionDetected(request, response);
return;
}
}
}
}
もちろん、ここには目に見える以上のものがあります。認証はThreadLocalに保存されます:
Spring Securityでは、リクエスト間にSecurityContextを格納する責任は、SecurityContextPersistenceFilterにあります。これは、デフォルトで、HTTPリクエスト間のHttpSession属性としてコンテキストを格納します。リクエストごとにコンテキストをSecurityContextHolderに復元し、重要なことに、リクエストが完了するとSecurityContextHolderをクリアします。セキュリティ上の理由から、HttpSessionを直接操作しないでください。そうする理由はまったくありません。代わりに、常にSecurityContextHolderを使用してください。
したがって、コンテキストデータをロードする(そして後で消去する)のはSecurityContextPersistenceFilterの責任であり、フィルターチェーンの他のモジュールがこのデータに基づいて決定を下します。(たとえば、usermanagerサービスを介して認証をスキップまたは実行します)
私はSpringSecurity開発者ではないので、この情報は知識に基づいた推測としてのみ使用してください:)