13 Stimmen

Wie kann man benutzerdefinierte Informationen im SecurityContext von Spring Security speichern?

In meiner Anwendung verwende ich LDAP-Authentifizierung. Ich habe jedoch auch 2 entfernte Dienste, die eine Authentifizierung über die Methode login(username, password) erfordern. Die Methode gibt einen Sicherheitstoken zurück, der es mir ermöglicht, andere Methoden aufzurufen, d.h. ich muss den Sicherheitstoken als ersten Argument an die Dienstmethoden übergeben.
Deshalb möchte ich diese Sicherheitstoken sofort nach erfolgreicher Anmeldung über LDAP erhalten und in SecurityContext speichern. Ich habe versucht, den authentication-success-handler-ref des form-login-Elements zu verwenden. Mit dem Handler ersetze ich das Authentication-Objekt im SecurityContext durch benutzerdefinierte AuthenticationToken, das nicht nur das Passwort, sondern auch Sicherheitstoken speichert. Aber in diesem Fall erhalte ich eine Ausnahme, dass kein Authentifizierungsanbieter diese Tokenklasse unterstützt. Ich weiß, dass es auch möglich ist, Token in der HTTP-Sitzung zu speichern, aber in diesem Fall muss ich die Sitzung an das Service-Objekt übergeben, also möchte ich die Token im SecurityContext speichern.

Was ist der beste Ansatz, um mit dem Sicherheitstoken des Dienstes umzugehen?

18voto

Gandalf Punkte 9365

Ich verwende oft das Authentication.getDetails()-Objekt, um zusätzliche Informationen zu speichern, die nicht direkt mit dem Benutzer verknüpft sind. So können Sie jedes beliebige Objekt in diesem Feld speichern (zum Beispiel eine HashMap) und es teilt den Lebenszyklus des Authentication-Objekts.

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

6voto

Gopi Punkte 9905

Ihre Implementierung von 'UserDetails' kann zusätzliche Daten enthalten. Diese Daten werden im SecurityContext gespeichert und sind nach einem erfolgreichen Login später abrufbar.

Sie können später darauf zugreifen, wenn (angenommen, MyUserDetails implementiert UserDetails)

Object principal = SecurityContextHolder.getContext().getAuthentication();
if (principal instanceof MyUserDetails) {
  MyUserDetails mud = (MyUserDetails) principal;
  mud.getMyData(); //Extrahieren Sie hier Ihre zusätzlichen Daten
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X