2013-08-15 5 views
7

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

答えて

10

SecurityContextHolderを使用することをお勧めします。

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

春はそれがdocumentationでどのように機能するかについて説明します。

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

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

関連する問題