Spring-Sicherheit oauth2 - Abrufen benutzerdefinierter Daten vom OAuth2-Principal

8

Ich habe eine Website, die Spring-Sicherheit verwendet und Benutzer (Benutzername & amp; Kennwort) und Standardformularauthentifizierung hat. Ich erlaube Benutzern, eine Client-ID und einen geheimen Client zu erstellen, die mit ihrem Konto verknüpft sind, um sie mit einer OAuth2-gesicherten Rest-API zu verwenden.

Ich verwende eine separate Client-ID & amp; Client-Secret für die API und nicht Benutzername und Passwort, damit der Benutzer sein Passwort ändern kann, ohne die API-Anmeldeinformationen zu verletzen, bestimmte Bereiche festzulegen, API-Zugriff usw. zu deaktivieren.

Ich verwende spring-security-oauth2 (Provider), um die Rest-API zu sichern, und ich habe einen Client-Credentials-Flow zugelassen. Ich habe die Client-Authentifizierung für die API eingerichtet, so dass die Client-ID und das Geheimnis überprüft werden.

Aus einer separaten Anwendung verwende ich die Client-ID und das Client-Geheimnis, um ein Zugriffstoken erneut zu erhalten und es mit der API zu verwenden. In den meisten Fällen verwende ich einfache @ PreAuthorize-Ausdrücke, die normalerweise auf Client-Rollen und dem Bereich basieren, und diese scheinen korrekt zu funktionieren.

Alles oben scheint gut zu funktionieren

Allerdings ... Ich habe jetzt ein paar API-Endpunkte, wo ich jedoch einige komplexere Regeln basierend auf einigen Details des zugrunde liegenden Benutzers implementieren muss - in diesem Fall der Benutzer, der die Client-ID und das Geheimnis generiert hat.

Betrachten Sie als einfaches Beispiel eine Messaging-Anwendung, bei der ich einen Endpunkt habe, mit dem Benutzer eine neue "Nachricht" eines bestimmten Typs veröffentlichen können, die variieren kann. Ich habe eine Tabelle der zulässigen Empfänger für jeden Benutzer und jeden Typ und ich möchte überprüfen, dass die Empfänger der geposteten Nachricht mit dem zulässigen Empfänger für den Typ übereinstimmen. (Die Daten für Benutzer zugelassene Empfänger sind in der Regel nicht groß und ändern sich selten. Daher kann ich gerne eine Kopie davon speichern, wenn ich ein Zugriffstoken erstelle)

Ich bekomme das Prinzipal an diesen Endpunkten und sehe, dass es sich um eine Instanz von OAuth2Authentication handelt, die folgendes enthält:

  • userAuthentication - null - Dies scheint für den Ablauf der Client-Anmeldeinformationen zu erwarten.
  • clientAuthentication ist ausgefüllt und authorizationParameters enthält den Berechtigungstyp und client_id

Ich nehme an, ich könnte die Client-ID von clientAuthentication.authorizationParameters verwenden, um den Benutzer und die Details zu suchen, die ich benötige, aber das wären ein paar Abfragen bei jedem API-Aufruf, die keinen Sinn ergeben.

Ich würde vermuten, dass es in Spring OAuth2-Bibliotheken einen schönen Ort / Weg gibt, der beim Zuweisen des Zugriffstokens einige zusätzliche Details hinzufügen könnte, damit ich sie später vom OAuth2Authentication (Principal) -Objekt abrufen konnte (oder etwas, das es erweitert? )

Gibt es alternativ dazu einen besseren Ansatz?

Thx!

    
Mark Doyle 23.04.2013, 16:55
quelle

3 Antworten

5

Sie können die Tokenkreationsklasse überschreiben, sodass das Token selbst den Benutzernamen enthält. (vielleicht verschlüsselt mit dem client_secret). Auf diese Weise können Sie den Benutzer, der sich auf ein Token bezieht, ohne zusätzlichen Datenbankzugriff vom Token selbst abrufen. Sie sollten überschreiben

%Vor%

mit Ihrer eigenen Klasse oder verwenden Sie TokenEnhancer

    
achiash 28.04.2013, 15:31
quelle
6

Warum Sie keine Scopes verwenden, die in Kundendetails definiert werden können und dann mit ScopeVoter validieren, ist dieses Token über den richtigen Umfang für den Zugriff auf diese Ressource verfügt oder nicht.

Bitte überprüfen Sie meine Demo für weitere Details

Ссылка

Update 1: Ich habe nicht auf Teil 2 Ihrer Frage "Benutzerdefinierte Daten vom OAuth2-Principal erhalten" geantwortet. Sie können den Rest-Service auf Ihrem Autorisierungsserver hinzufügen, auf den mit dem OAuth-Token zugegriffen wird, um Ihnen die erforderlichen Informationen zu diesem Token-Benutzer zu geben Sorgen Sie für "OAuth2-Prinzipal", Sie beschäftigen sich auch mit dem Autorisierungsserver als Ressourcenserver.

    
Bassem Reda Zohdy 28.04.2013 14:27
quelle
5

Meiner Meinung nach wäre der richtige Ansatz hier, den "password" -Fluss von oauth2 anstelle von Client-Credentials zu verwenden. Sie können eine allgemeine Client-ID und ein Client-Secret erstellen und allen Benutzern zur Verfügung stellen. Jeder Benutzer kann sein eigenes Token mit diesen Kundendetails und seinem eigenen Benutzernamen und Passwort anfordern. Auf diese Weise wird jedes Token mit einem UserDetails-Objekt verbunden, das Ihr Problem löst. Sie können sehen, wie dies hier gemacht wurde: Ссылка

    
achiash 28.04.2013 14:33
quelle