2011-10-25 13 views
25

これは共通の問題でなければなりません...私はグーグルとソーイングの後に、十分に答えを徹底的に見ていないか、no1がそれを尋ねていないに違いないと感じます...だから私を許してください。Hibernateで更新した後でSpring Security Principalを再読み込みするには?

私は休止状態などのように、ユーザー/プリンシパルがログインした

と春のセキュリティを使用して、そのプロファイルにいくつかの変更を加えています。

プロファイル(UserDetails)を更新するために私のDAOを使用しています。私はプリンシパルにこのアップデートを自動的に反映させたいと思います。

私は再びプリンシパルを取得すると、私は(私の最初のログインから)汚れたバージョンを取得します。

更新されたUserDetailsをHibernateから再ロードするためにSpring Securityを取得する方法を知っている人はいますか?

+0

OK私は私を助けた何かを見つけました。http://stackoverflow.com/questions/2398224/spring-security-autowire-providermanager プロバイダマネージャを取得すると、私は再認証を受けることができました。 問題は、新しいプリンシパルがすべての周辺参照を怠惰に初期化して、例外をもっと下にスローするようになっているようです。 – alwinc

+0

これは本当にHibernate/ORM戦略の問題であり、Spring Securityの問題ではありません。 ... 右? –

+1

ええ、もう少し調べてみましたが、セキュリティ上の理由からSpring SecがUserDetailsを免除できると思われます。そのため、パスワードを再入力させることにより、ユーザーの詳細を再ログインすることをお勧めします。 – alwinc

答えて

41

OK掘り出して、最終的に答えを見つけました。

UsernamePasswordAuthenticationTokenを作成し、更新されたプリンシパルをコンテキストに割り当てることができます。

Authentication authentication = new UsernamePasswordAuthenticationToken(userObject, userObject.getPassword(), userObject.getAuthorities()); 
SecurityContextHolder.getContext().setAuthentication(authentication); 

How to manually set an authenticated user in Spring Security/SpringMVC」も参照してください。

+6

あなたのソリューションは機能します。私は 'UsernamePasswordAuthenticationToken'の代わりに' PreAuthenticatedAuthenticationToken'を使用します。これは基本的に同じことを行います。あなたの意図を明確にし、コードの可読性を高めるだけです –

関連する問題