SecurityContextHolder
から取得するUserprincipalは、リクエストまたはセッションにバインドされていますか?
UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
これは、現在ログインしているユーザーにアクセスする方法です。現在のセッションが破棄された場合、これは無効になりますか?
設定方法によって異なります(または、別の動作を設定できます)。
Webアプリケーションでは、- ThreadLocalSecurityContextHolderStrategy
と対話する SecurityContextPersistenceFilter
を使用します。
Java SecurityContextPersistenceFilter
のドキュメントは次で始まる:
リクエストの前に構成済みの{@link SecurityContextRepository}から取得した情報を{@link SecurityContextHolder}に入力し、リクエストが完了してコンテキストホルダーをクリアすると、リポジトリに保存します。デフォルトでは、{@ link HttpSessionSecurityContextRepository}を使用します。 HttpSession関連の構成オプションについては、このクラスを参照してください。
ところで:HttpSessionSecurityContextRepositoryはSecurityContextRepositoryの唯一の実装です(デフォルトのライブラリで見つかりました)
それはこのように動作します:
HttpSessionSecurityContextRepository
は、httpSession(Key = "SPRING_SECURITY_CONTEXT")を使用してSecurityContext
オブジェクトを格納します。SecurityContextPersistenceFilter
は、SecurityContextRepository
などのHttpSessionSecurityContextRepository
を使用して、SecurityContext
オブジェクトをロードおよび保存するフィルターです。 HttpRequestがフィルターを渡すと、フィルターはリポジトリからSecurityContext
を取得し、SecurityContextHolder(SecurityContextHolder#setContext
)SecurityContextHolder
には、setContext
とgetContext
の2つのメソッドがあります。どちらもSecurityContextHolderStrategy
を使用して、set-およびget-Contextメソッドで正確に行われることを指定します。 -たとえば、ThreadLocalSecurityContextHolderStrategy
はローカルのスレッドを使用してコンテキストを保存します。要約すると、ユーザープリンシパル(SecurityContextの要素)はHTTPセッションに格納されます。また、リクエストごとに、アクセス元のローカルスレッドに配置されます。