2013-03-01 2 views
6

Ich muss die IP-Adresse im Auge behalten, wenn sich Benutzer in meine Federanwendung einloggen.Wie kann ich die IP-Adresse eines authentifizierten Benutzers mit Spring-Sicherheit in einer Datenbank speichern?

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> 

mit Bohne:

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

Ich habe eine benutzerdefinierte Userservice mit einer Methode loadUserByUsername() Rückkehr ein benutzerdefinierten Userdetails. Diese Methode ruft die UserDetails über ein DAO aus einer Datenbank ab. Die UserDetails enthalten für den Benutzer relevante Daten wie Benutzername, Passwort, Berechtigungen, E-Mail-Adresse, aber auch anwendungsspezifische Variablen. Ich muss auf diese Variablen in meinen JSP-Seiten zugreifen.

Ich möchte in einer Datenbank (über einen Aufruf einer Methode in einem benutzerdefinierten Dienst, die eine DAO-Methode aufrufen) die IP-Adresse, Zeitstempel und Benutzer-ID speichern, wenn ein Benutzer in meiner Anwendung erfolgreich authentifiziert wird.

Ich bin mir nicht sicher, was ich tun soll: Soll ich einen benutzerdefinierten Authentifizierungsanbieter implementieren? erweitert DaoAuthenticationProvider? oder AbstractUserDetailsAuthenticationProvider? oder etwas anderes?

Weitere allgemeine Fragen:

A. Wo kann ich hinzufügen, eine Methode aufrufen, wenn ein Benutzer die richtigen Anmeldeinformationen bereitstellt?

B. Wie kann ich die IP-Adresse des Benutzers abrufen? (Wissen, dass Tomcat hinter Apache in einem Reverse-Proxy läuft).

Ich versuchte, verwandte Fragen/Antworten zu sehen, aber es machte mich nur mehr verwirrt. Wenn jemand eine sehr einfache Schritt-für-Schritt-Implementierung bereitstellen könnte, wäre das großartig. Vielen Dank!

Antwort

8

Sie können einen benutzerdefinierten Authentifizierungserfolgshandler angeben, der für das Speichern einer IP des aktuellen Benutzers in der DB verantwortlich ist. Siehe Authentifizierung-success-handler-ref Attribut von form-login Tag. Es wird empfohlen, eine der vorhandenen Implementierungen (z. B. SavedRequestAwareAuthenticationSuccessHandler) zu erweitern und Ihre Funktionalität hinzuzufügen.

Sie können einfach von überall IP nach der Authentifizierung erhalten, indem Sie:

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

es versuchen. Wenn Sie aufgrund des Reverse Proxys eine falsche IP-Adresse erhalten, sollten Sie die Client-IP als Anforderungsheader hinzufügen.

+0

Vielen Dank! Es ist in der Tat, was ich brauche. Ich habe SavedRequestAwareAuthenticationSuccessHandler erweitert und meinen Code hinzugefügt, um die IP-Adresse entsprechend zu speichern. Ich benutze Tomcat mit Apache als Reverse Proxy. Daher sehe ich nur lokale IP-Adresse (127.0.0.1). Wie geben Sie an, die richtige IP-Adresse als Anforderungsheader in Apache hinzuzufügen? und wie erhalten Sie diese IP-Adresse in der AuthenticationSuccessHandler? Vielen Dank! – awesome

+1

Versuchen Sie 'String ip = request.getHeader (" X-Forwarded-For ")'. Wenn die Client-IP nicht von Apache gesendet wird, schauen Sie sich das Plugin [this] (http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html) an. –