2010-07-20 23 views
6

In meiner Anwendung verwende ich LDAP-Authentifizierung. Aber ich habe auch 2 Remote-Dienste, die Authentifizierung über Methodenanmeldung (Benutzername, Passwort) erfordert. Die Methode gibt ein Sicherheitstoken zurück, das es mir ermöglicht, andere Methoden aufzurufen, d. H. Ich sollte das Sicherheitstoken als erstes Argument an Dienstmethoden übergeben.
Also möchte ich diese Sicherheitstoken sofort nach erfolgreicher Anmeldung mit LDAP erhalten und sie in SecurityContext speichern. Ich habe versucht, Authentifizierung-success-handler-ref von Formular-Login Element zu verwenden. Mit dem Handler ersetze ich Authentifizierung Objekt im SecurityContext mit benutzerdefinierten AuthenticationToken, die nicht nur Passwort, sondern auch Sicherheitstoken enthält. Aber in diesem Fall habe ich eine Ausnahme, dass kein Authentifizierungsanbieter diese Klasse von Token unterstützt. Ich weiß, dass es auch möglich ist, Tokens in der HTTP-Sitzung zu speichern, aber in diesem Fall muss ich ein Session-to-Service-Objekt übergeben, daher möchte ich die Tokens in SecurityContext speichern.Wie Sie benutzerdefinierte Informationen in SecurityContext von Spring-Security speichern?

Was ist der beste Ansatz, um Service Security Token zu behandeln?

Antwort

10

Ich benutze oft die Authentication.getDetails() Objekt zusätzliche Informationen zu speichern, die nicht direkt an den Benutzer pro sagen verknüpft sein können. So können Sie jedes gewünschte Objekt in diesem Feld speichern (z. B. eine HashMap) und es teilt sich den Objektlebenszyklus Authentication.

HashMap<String, Object> info = new HashMap<String, Object>(); 
info.put("extraInfo", "info"); 
auth.setDetails(info); 
... 
Map<String, Object> i = (Map<String, Object>)SecurityContextHolder.getContext().getAuthentication.getDetails(); 
4

Ihre Implementierung von 'UserDetails' kann zusätzliche Daten enthalten. Dies wird im SecurityContext gespeichert, auf den später nach erfolgreicher Anmeldung zugegriffen werden kann.

Sie Später können Sie als (Geht davon aus MyUserDetails implementiert Userdetails)

Object principal = SecurityContextHolder.getContext().getAuthentication(); 
if (principal instanceof MyUserDetails) { 
    MyUserDetails mud = (MyUserDetails) principal; 
    mud.getMyData(); //Extract your additional data here 
} 
+0

Ich bin nicht sicher, ob ich userDetailsSerivce mit LDAP-Authentifizierung verwenden kann. – viator

+1

Sie müssen nicht den gesamten UserDetailsService implementieren. Sie können nur Ihre eigene Implementierung von UserDetails mit LDAP verwenden. Hier finden Sie Informationen dazu - http://static.springsource.org/spring-security/site/docs/3.1.x/reference/ldap.html#ldap-custom-user-details – Gopi

Verwandte Themen