web-dev-qa-db-ja.com

Spring SecurityのSecurityContextHolder:セッションまたはリクエストのバインド?

SecurityContextHolderから取得するUserprincipalは、リクエストまたはセッションにバインドされていますか?

UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

これは、現在ログインしているユーザーにアクセスする方法です。現在のセッションが破棄された場合、これは無効になりますか?

60
chzbrgla

設定方法によって異なります(または、別の動作を設定できます)。

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には、setContextgetContextの2つのメソッドがあります。どちらもSecurityContextHolderStrategyを使用して、set-およびget-Contextメソッドで正確に行われることを指定します。 -たとえば、ThreadLocalSecurityContextHolderStrategyはローカルのスレッドを使用してコンテキストを保存します。

要約すると、ユーザープリンシパル(SecurityContextの要素)はHTTPセッションに格納されます。また、リクエストごとに、アクセス元のローカルスレッドに配置されます。

109
Ralph