5

SecurityContextHolder.getContext().getAuthentication()サーバー側で現在ログインしているユーザーを取得し、ユーザーに ログオンします。

ここに質問があります: 3 人のユーザーがログインしているとします。サーバー側は、単にSecurityContextHolder.getContext().getAuthentication();.

お返事をありがとうございます。

4

2 に答える 2

8

デフォルトでは、ここには 3 つの重要事項があります。

  • HTTP セッション - リクエスト間で認証オブジェクトを保存します
  • サーブレット API フィルタ - SecurityContextHolderHTTP セッションからの各リクエストの前に入力します (リクエストが完了すると、認証オブジェクトを保存します)
  • ThreadLocal- リクエスト処理中に認証オブジェクトを保存します

認証後、対応するSecurityContextオブジェクトが HTTP セッションに格納されます。各リクエスト処理スペシャルSecurityContextPersistenceFilterが起動される前。SecurityContextHTTP セッションから (インスタンスを介して) オブジェクトをロードし、オブジェクトSecurityContextRepositoryを に注入SecurityContextしますSecurityContextHolder。詳細については、クラスのソース コードをSecurityContextPersistenceFilter参照してください。もう 1 つの重要な部分は、デフォルトで変数を使用してオブジェクトをSecurityContextHolder格納することです (したがって、スレッドごとに異なる認証オブジェクトを持つことになります)。SecurityContextThreadLocal

編集。追加の質問:

  1. HTTP セッションはクライアントのブラウザに保存され、リクエスト間で更新されます。いいえ、HTTP セッションはサーバー側に保存されます。セッション cookie を介して一部のユーザーにリンクされます (ブラウザは各リクエスト中にこの cookie を送信します)。
  2. SecurityContext、SecurityContextHolder、および SecurityContextRepository は、サーバー側のインスタンスです。それらはサーバー側で使用されます。ただしSecurityContextHolder、インスタンスではなく、静的メソッドを持つヘルパー クラスです。
  3. ThreadLocal は、SecurityContext を格納する SecurityContextHolder を格納する変数であり、変数に格納SecurityContextされThreadLocalます。変数を介してインスタンスSecurityContextHolderを取得/設定するために使用できるヘルパー クラスです。SecurityContextThreadLocal
  4. 3 つの接続がある場合、Server には 3 つの SecurityContext オブジェクトがあります。うん。
  5. 1 つの SecurityContextHolder が 1 つの SecurityContextいいえ、対応するSecurityContextHolderを取得/設定するためにすべてのスレッドで使用される同じ静的メソッドを格納します。 SecurityContext
  6. また、サーバー側に 3 つの SecurityContext インスタンスがあるとします。どのインスタンスが対応するクライアントを参照しているかをどのように判断するのでしょうか? ThreadLocalvariable は、スレッドごとに異なる値を持ちます。
于 2013-08-20T08:56:18.750 に答える