2009-12-08 17 views
20

Spring Securityがユーザを認証すると、UserDetailオブジェクトが作成され、web-appで現在のUserIdを見つけることができます。しかし、私は、UserDetailsやUserDetailsを置き換えながら、プリファレンスやその他の詳細でカスタム・ユーザー・オブジェクトを保持したいとしましょう。春のセキュリティが正常に を認証するときSpring Securityがユーザーを認証したときに、セッションでカスタム・ユーザー・オブジェクトを管理する方法は?

だから、どのセッションにカスタムユーザーオブジェクトを追加するには?そして、Spring Securityがログインしているユーザをログアウトするときに、セッションからカスタムユーザオブジェクトを削除する方法。

それともこれを行うための任意の適切な方法は何ですか?

+2

誰かが私が聞きたい正確に何を尋ねられたとき、私は大好きです! – Adelin

答えて

18

このIMOを行うための最善の方法は、あなたのサービスの一つ(おそらくUserServiceのは)UserDetailsS​​erviceを実装し、独自のユーザー詳細サービスを利用したい春のセキュリティXMLで指定することです。 UserDetailsS​​erviceを行う必要がありますどのような

はloadByUsername(文字列名)メソッドを実装しています。このメソッドは、UserDetailsを実装するクラスを返す必要があります。これは、好きなものを格納している独自のカスタムオブジェクトにすることができます。これの利点は、Springセキュリティtaglibを介してJSPからオブジェクトのプロパティにアクセスでき、Springセキュリティでは常にSecurityContextHolderシングルトン(スレッドセーフ)から利用できることです。ここで

は、このためのドキュメントへのリンクです:ここではspring security manual, chapter 8 は、パスワードの暗号化のためのカスタムユーザー詳細サービスの実装について話してブログ記事です:example usage

希望これは

編集を支援します言及を忘れましたオブジェクトがログアウト時にセキュリティコンテキストとセッションから削除されることを示します。それが最も有用なのは、春のセキュリティによって完全に管理されていることです。

0

あなたは間違いなくUserDetailServiceあなた自身を記述する必要があります。プリンシパルオブジェクトにはユーザがあり、AuthenticationTokenには他のログイン情報のMap(String、String)を格納できるDetailsオブジェクトもあります。

public class RequestFormDeatils extends SpringSecurityFilter { 

    protected void doFilterHttp(HttpServletRequest request, ...) { 
     SecurityContext sec = SecurityContextHolder.getContent(); 
     AbstractAuthenticationToken auth = (AbstractAuthenticationToken)sec.getAuthentication(); 
     Map<String, String> m = new HashMap<String, String>; 
     m.put("myCustom1", request.getParameter("myCustom1")); 
     m.put("myCustom2", request.getParameter("myCustom2")); 
     auth.setDetails(m); 
} 

今、どこでも、あなたのコードの中で、あなたのUserDetailsオブジェクトに結合するために、それをせずに、このセキュリティ関連の情報を伝播し、または引数として渡すためにSecurityContextを使用して取得します。私はこのコードをSpring Security Filterチェーンの最後にあるSecurityFilterで行っています。

<bean id="requestFormFilter" class="...RequestFormDetails"> 
    <custom-filter position="LAST" /> 
</bean> 

この情報は、ユーザーが削除されると(ログアウト時など)削除されます。  

関連する問題