Spring-Sicherheit Ouath2: Erweiterte UserDetails wurden vom Principal-Objekt nicht zurückgegeben

9

Letzte Woche habe ich damit begonnen, die UserDetails-Klasse zu erweitern, um ein benutzerdefiniertes Feld unterstützen zu können. Das Besondere an diesem Feld ist, dass es mit einem Wert gefüllt wird, der von einem Anforderungsparameter abhängt. Ich habe es geschafft, dies korrekt umzusetzen (also konzentriert sich die Frage nicht darauf).

Nun ist es so, dass nach einer erfolgreichen Anmeldung das UserDetails-Objekt korrekt gefüllt wird (ich konnte dies mit einem AuthenticationSuccessHandler sehen) und der Client erhält ein JWT-Token vom OAuth2-Provider. Der Client versucht dann, weitere Details über den Benutzer abzurufen, indem er den Endpunkt "/ uaa / user" aufruft. Dies ist so eingestellt, dass das Principal-Objekt zurückgegeben wird. Aber nachdem ich den Inhalt des Principal-Objekts überprüft hatte, wurde mir klar, dass das Objekt UserDetails fehlte. Die Methode getPrincipal () hat nur den Benutzernamen anstelle des UserDetails-Objekts zurückgegeben.

Nach diese Frage Dies ist das Ergebnis einer fehlgeschlagenen Anmeldung. Das AuthenticationToken (in diesem Fall ein UsernamePasswordAuthenticationToken) wird vom AuthenticationManager zurückgewiesen. Ich habe keine Ahnung, warum es so etwas tun sollte. Die Authentifizierung mit dem Standardobjekt UserDetails scheint einwandfrei zu funktionieren. Kann mir jemand helfen, dieses Problem zu lösen?

Einige Details zu den implementierten Klassen (wie oben erwähnt). Irgendein Code wurde hier aus Gründen weggelassen.

CustomUserDetails

%Vor%

CustomUserDetailsService

%Vor%

Konfiguration

%Vor%

Benutzerendpunkt

%Vor%

Das Principal-Objekt, das hier zurückgegeben wird, sollte das UserDetails-Objekt enthalten und es an den Client zurückgeben. Aber stattdessen gibt es nur einen String mit dem Benutzernamen zurück, wenn Sie getPrincipal ();

aufrufen

Am Ende möchte ich, dass der vom Benutzerendpunkt zurückgegebene JSON (der das Principle-Objekt zurückgibt) das benutzerdefinierte Feld enthält, das ich den UserDetails hinzugefügt habe.

Vielen Dank im Voraus.

    
Robin Hermans 12.10.2015, 10:13
quelle

2 Antworten

4

Im Allgemeinen benötigen Sie die Annotation @AuthenticationPrincipal , aber ich werde Ihnen vorschlagen, Ihre eigene Annotation zu erstellen, etwa so:

%Vor%

Dann kannst du diese Principal auf diese Weise haben:

%Vor%

ABER, IMHO sollten Sie Ihren eigenen Impl des Principals haben oder eher den bestehenden Impl erweitern. etwas wie das:

%Vor%

In diesem Fall können Sie Werte zurückgeben, was immer Sie wollen.

    
Jaiwo99 19.05.2016, 12:11
quelle
0

Sie können diese Methode in jedem Fall verwenden, um ein erweitertes Benutzerdetailobjekt im Controller oder an einer anderen Stelle zu erhalten. Es kann Nachteile in dieser Methode geben, aber es ist effektiv.

%Vor% %Vor%     
Maleen Abewardana 24.05.2016 16:12
quelle