2011-08-24 6 views
8

SpringSecurityには、クラス名SecurityContextHolderとその仕様があります。 '指定されたSecurityContextを現在の実行スレッドに関連付けます。'要求がサーバーに来るたびにWebアプリケーションでSpringもリロードし、スレッドのSecurityContextHolderでその要求のSecurityContextを設定しますか?Spring SecurityはどのようにしてWebアプリケーション要求のスレッドでSecurityContextを管理しますか?

+0

http://stackoverflow.com/questions/6408007/spring-securitys-securitycontextholder-session-or-request-boundをご参照ください – Ritesh

答えて

7

Webアプリケーションでは、リクエストがサーバーに到着するたびにSpringもリロードし、そのリクエストのSecurityContextをそのスレッドのSecurityContextHolderに設定しますか?

基本的にはい。

デフォルト動作のSecurityContextHolder.getInstance()は、現在のスレッドのスレッドローカルとして格納されたSecurityContextHolderインスタンスを返すことです。 (これが唯一のデフォルトのメカニズムである。あなたはSecurityContextHolder.setStrategemName()を呼び出すことによってSecurityContextHolderを見つけるためのさまざまな戦略を使用することができます)

SpringSecurityフィルタが要求のSecurityContextHolderが(ただし、それが配置されている)開始時に要求の資格情報がロードされていることを確認し、要求処理の終了時にホルダーがクリアされたことを示します。

+0

エラボレーション、キーはリモート呼び出しは、セキュリティ属性にフィルタが見えることですコンテキスト。セキュリティコンテキストがリモート呼び出し属性にある場合のみ、SecurityContextHolderで設定できます。このセキュリティコンテキストは、通常、クライアントから、発信呼び出しを処理し、スレッドローカルからのセキュリティコンテキストをリモート呼び出しに配置する類似のフィルタを使用して提供されます。 – Zach

+0

[なぜこれは動作しません](https://github.com/spring-projects/spring-security/issues/3919)私のために? [stackoverflow question](http://stackoverflow.com/questions/34273755/why-is-the-authentication-object-of-the-securitycontext-not-shared-across-thread)を参照してください。 – displayname

9

はい、SecurityContextPersistenceFilterがこれを処理します。デフォルトでは、HttpSession内にSecurityContextが配置され、SecurityContextHolderを介してスレッドにバインドされます。リクエストの処理が終了すると、逆の処理が実行されます。スレッドからSecurityContextを取得し、セッションに配置します。 Javadocのより

:要求が完了し コンテキストホルダをクリア一旦

それはリポジトリに先立っ リクエストとストアへ 構成SecurityContextRepositoryから得られた情報とSecurityContextHolderバック移入します。デフォルトでは、 HttpSessionSecurityContextRepositoryが使用されます。

+0

スレッドセーフでもありませんか? 'SecurityContext'が私のアプリケーションのスレッド間で共有されていないようです([リンク](http://stackoverflow.com/questions/34273755/why-is-the-authentication-object-of-the-securitycontext-not -shared-across-thread))。 – displayname

関連する問題