2011-06-20 13 views
57

私はSecurityContextHolderから取得したUserprincipalを要求またはセッションにバインドしていますか?SpringセキュリティのSecurityContextHolder:セッションまたは要求がバインドされていますか?

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

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

答えて

102

どのように設定したかによって異なります(別の動作を設定することもできます)。

SecurityContextPersistenceFilterと対話するThreadLocalSecurityContextHolderStrategyをWebアプリケーションで使用します。 SecurityContextPersistenceFilter開始の

ジャワDOC:

が構成 から得られた情報を用いて、{@link SecurityContextHolderを}移入{@link SecurityContextRepository}前 要求とバック格納それをしますいったん要求が を完了し、コンテキスト の所有者を完了すると、 リポジトリ。デフォルトでは、HttpSessionSecurityContextRepository}を使用します。 詳細については、このクラスを参照してください。 HttpSession related 設定オプション。

ところで:HttpSessionSecurityContextRepository SecurityContextRepositoryの唯一の実装です(私はデフォルトのLIBSに発見した)

それは次のように動作します。

  • HttpSessionSecurityContextRepositoryは(キー=」のHttpSessionを使用していますSPRING_SECURITY_CONTEXT ")を使用してSecurityContextオブジェクトを格納します。
  • SecurityContextPersistenceFilterは、SecurityContextRepository、たとえばHttpSessionSecurityContextRepositoryを使用してSecurityContextオブジェクトをロードして格納するフィルタです。 HttpRequestのフィルタを通過した場合、フィルタは、リポジトリからSecurityContextを取得し、SecurityContextHolder(SecurityContextHolder#setContext)に入れて
  • SecurityContextHolderは二つの方法setContextgetContextを持っています。どちらも、SecurityContextHolderStrategyを使用して、setおよびget-Contextメソッドで正確に何が行われたのかを指定します。例えば、ThreadLocalSecurityContextHolderStrategyはスレッドを使用してコンテキストを格納します。

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

関連する問題