4

Spring Security 3.0.5 と SecurityContext についていくつか質問があります。まず第一に、私が知っていることを結論付けようとします:

  • SecurityContextHolder は SecurityContext を格納します
  • リクエスト間、SecurityContext は HttpSession に格納されます
  • リクエストの開始: SecurityContextHolder は HttpSession から SecurityContext を取得します
  • リクエストの終わり: SecurityContextHolder は SecurityContext を HttpSession に入れます

  • リクエスト中、サーバー上で、SecurityContextHolder は ThreadLocal を使用します。アプリケーション (同じ要求) のどこでも、SecurityContext にアクセスできます。

今私の質問....

--> 2 つの要求: SecurityContext インスタンスが共有されます

これはどのように作動しますか?つまり、SecurityContextHolder はリクエストごとに ThreadLocal を使用します。2 リクエスト = 2 ThreadLocals

各リクエストは次のことを行います: HttpSession からの getSessionAttribute (SecurityContext) それらが SecurityContext で機能するとどうなりますか? SecurityContext はすべての ThreadLocals で変更されていますか?

私の知る限り:はい(??)

これはどのように作動しますか?同じインスタンスでどのように作業できますか? つまり、2 つの異なる ThreadLocals を持つ 2 つの異なるスレッドが同じインスタンスでどのように機能するのか想像できませんか?

API (ThreadLocal): このクラスはスレッドローカル変数を提供します。これらの変数は、(get メソッドまたは set メソッドを介して) アクセスする各スレッドが独自の、独立して初期化された変数のコピーを持っているという点で、通常の変数とは異なります。

つまり、それだけです:コピー!多分私は間違っていて、2 つのスレッドが同じ SecurityContext で動作することはできないのでしょうか? しかし、Spring Security Documentation はそう言っています!

誰かが私にそれを説明できれば素晴らしいでしょう:-)ありがとう!

4

1 に答える 1

2

各スレッドには独自の の値がありますがThreadLocal、これらの値が等しくなることを妨げるものは何もありません。したがって、この場合、複数のスレッドが の同じインスタンスへの参照を持つことになりますSecurityContext

通常は問題ありませんが、セキュリティ コンテキストを変更したい場合は、防御的コピーを有効にできます。 SEC-356を参照してください。

于 2011-06-16T18:01:35.603 に答える