2013-03-01 12 views
6

ユーザーが私の春のアプリケーションにログインするとき、私はIPアドレスを追跡する必要があります。春のセキュリティで認証されたユーザからのIPアドレスをDBに保存する方法は?

のsecurity.xml:豆と

<authentication-manager alias="authenticationManager"> 
<authentication-provider user-service-ref="userService"> 
    <password-encoder ref="passwordEncoder"> 
     <salt-source user-property='username' /> 
    </password-encoder> 
</authentication-provider> 

<beans:bean id="passwordEncoder" 
    class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"> 
    <beans:constructor-arg value="512" /> 
</beans:bean> 

は、私は、カスタムUserDetailsを返すメソッドloadUserByUsername()でカスタムUserServiceのをしました。このメソッドは、DAOを介してデータベースからUserDetailsを取得します。 UserDetailsには、ユーザー名、パスワード、権限、電子メールアドレスなどのユーザーに関連するものだけでなく、アプリケーション固有の変数も含まれています。 JSPページでこれらの変数にアクセスする必要があります。

ユーザーが自分のアプリケーションで正常に認証されたときに、IPアドレス、タイムスタンプ、およびユーザーIDをデータベースに保存したい(DAOメソッドを呼び出すカスタムサービスのメソッド呼び出しを使用)。

私は何をすべきか分かりません。カスタム認証プロバイダを実装する必要がありますか? DaoAuthenticationProviderを拡張しますか?またはAbstractUserDetailsAuthenticationProvider?または、他の何か?

もっと一般的な質問:ユーザーが右の資格情報を提供していたら、私が呼び出すメソッドを追加することができます

A.?

B.どのようにしてユーザーのIPアドレスを取得できますか? (Tomcatが逆プロキシでApacheの背後にあることを知っている)。

私は関連する質問/回答を見ようとしましたが、私はもっと混乱させました。もし誰かが非常に簡単なステップバイステップの実装を提供できれば、それはすばらしいでしょう。ありがとう!

答えて

8

DBに現在のユーザのIPを保存するカスタム認証成功ハンドラを提供できます。 authentication-success-handler-ref属性のform-loginタグを参照してください。既存の実装(たとえばSavedRequestAwareAuthenticationSuccessHandler)の1つを拡張して機能を追加することをお勧めします。

あなただけ行うことにより、どこからでも認証後にIPを取得することができます:

WebAuthenticationDetails details = (WebAuthenticationDetails)SecurityContextHolder.getContext().getAuthentication().getDetails(); 
String ip = details.getRemoteAddress(); 

はそれを試してみてください。リバースプロキシのために間違ったIPアドレスを与えた場合は、クライアントIPをリクエストヘッダーとして追加することを検討してください。

+0

ありがとうございました!それは確かに私が必要なものです。 SavedRequestAwareAuthenticationSuccessHandlerを拡張し、それに応じてIPアドレスを保存するコードを追加しました。しかし、私はリバースプロキシとしてApacheを使ってTomcatを実行しています。したがって、私はローカルIPアドレス(127.0.0.1)だけを参照してください。あなたはどのように右のIPアドレスをリクエストヘッダーとしてApacheに追加するように指定しますか?あなたはどのようにauthenticationSuccessHandlerのIPアドレスを取得しますか?ありがとう! – awesome

+1

'' String ip = request.getHeader( "X-Forwarded-For") 'を試してください。クライアントIPがApacheによって送信されない場合は、[this](http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html)プラグインを調べてください。 –

関連する問題