11

私の春の MVC アプリケーションPrincipalでは、サービス層で春のセキュリティによって作成されたオブジェクトにアクセスしたいと考えています。サービスクラスに注入することを考えましたが、スレッドセーフではないと確信しています。私が考えている他のオプションは、それをすべてのサービスメソッドに引数として渡すことですが、これは私にはあまりきれいに見えません。これを行うためのより良い方法は何でしょうか?

4

1 に答える 1

22

を使用するのが最善の方法だと思いますSecurityContextHolder

Principal principal = SecurityContextHolder.getContext().getAuthentication();

Spring はドキュメントでどのように機能するかを説明しています:

最も基本的なオブジェクトは SecurityContextHolder です。これは、現在アプリケーションを使用しているプリンシパルの詳細を含む、アプリケーションの現在のセキュリティ コンテキストの詳細を保存する場所です。デフォルトでは、SecurityContextHolder は ThreadLocal を使用してこれらの詳細を格納します。これは、セキュリティ コンテキストがメソッドの引数として明示的に渡されていない場合でも、同じ実行スレッド内のメソッドで常にセキュリティ コンテキストを使用できることを意味します。この方法で ThreadLocal を使用することは、現在のプリンシパルの要求が処理された後にスレッドをクリアするように注意すれば、非常に安全です。もちろん、Spring Security はこれを自動的に処理するため、心配する必要はありません。

を使用しThreadLocalて現在の認証を保存するため、スレッド セーフの問題は発生しません。

于 2013-08-15T09:56:52.607 に答える