2017-05-27 2 views
1

So war ich zunächst verwirrt darüber, welchen benutzerdefinierten AuthenticationManager oder sogar benutzerdefinierten AuthenticationProvider ich implementieren könnte, nachdem ein Benutzer einen autorisierten JWT auf seinem Clientgerät vom Autorisierungsserver in einer oAuth2-Umgebung durchläuft.Erhalten Sie das Authentifizierungsobjekt (Principal) über oAuth2 Spring Security?

Dann traf mich, duh, der Benutzer muss nicht durch einen AuthenticationManager gehen, weil sie bereits durch den Authorization Server "authentifiziert" wurden, was auch immer oAuth2-Flow im System implementiert ist. Sie haben das JWT-Zugriffs-Token, um es zu beweisen, und tatsächlich sind sie nicht in der Lage, Ressourcen-Server-Endpunkte ohne ein autorisiertes Zugriffstoken zu treffen.

Ich möchte jedoch immer noch eine Möglichkeit, auf das Authentifizierungsobjekt zuzugreifen, das alle Benutzerinformationen enthält.

Wie würden Sie einen Verweis auf dieses Authentifizierungsobjekt erstellen und abrufen, ohne einen AuthenticationManager verwendet zu haben? Ich bin hier ziemlich verwirrt.

Der Hauptgrund, warum ich dieses Authentifizierungsobjekt haben möchte, ist, weil ich plane, Sicherheit auf der Methodenebene mit benutzerdefinierten Ausdrücken neben der ACL von Spring Security zu verwenden. Mit anderen Worten, ich möchte, dass oAuth2 und ich auch eine ACL verwenden möchten, um eine sehr genaue granulare Kontrolle darüber zu haben, welche Benutzer Berechtigungen/Berechtigungen für welche Domänenobjekte haben.

Wie bekomme ich Zugriff auf dieses Authentifizierungsobjekt (vielleicht sogar mit dem aktuellen Zugriffstoken des Benutzers als Feld/Eigenschaft erstellen) nach dem Einrichten von oAuth2?

Danke.

Antwort

1

Man hat folgende Controller-Methode:

@RequestMapping(...) 
Output do(Input input) 

Sie können Authentication Objekt den Parameter hinzufügen:

@RequestMapping(...) 
Output do(Input input, Authentication authentication) 

Frühling wird diese Abhängigkeit automatisch verdrahten. Wenn Sie in einer tieferen Schicht/andere Klasse sind, können Sie verwenden

SecurityContextHolder.getContext().getAuthentication() 
+0

Also lassen Sie mich verstehen. Wenn Sie oAuth2 mit Spring Security verwenden, wird das Authentication-Objekt automatisch erstellt und in SecurityContextHolder.getContext() festgelegt. SetAuthentication()? Wenn wahr, dann 1) welche AuthenticationManager-Implementierung wird verwendet, um dies zu tun? 2) Wenn es eine AuthenticationProvider-Instanz ist, welche Implementierung ist das? 3) Welche UserDetailsService-Implementierung prüft im Hintergrund, ob das Token, das im Anforderungsheader gesendet wird, gültig ist, und extrahiert dann auch den Benutzernamen und andere Berechtigungsnachweise, die zum Ressourcenbesitzer des Tokens gehören, aus der Datenquelle. –

+1

Sry, war letzten Tag nicht online. Ja Spring erstellt dieses Objekt basierend auf dem Inhalt des Authentifizierungstokens automatisch. Normalerweise müssen Sie Ihre eigene UserDetailsService-Implementierung bereitstellen. Ich habe ein Beispiel mit einfachen DB-Login und oauth2 hier gemacht: https://github.com/miwoe/spring-security Aber es ist nicht gut dokumentiert. Es basiert auf diesem: https://github.com/spring-guides/tut-spring-security-and-angular-js –

Verwandte Themen