wake-up-neo.com

Verwenden von Bereichen als Rollen in Spring Security OAuth2 (Anbieter)

Betrachten wir eine recht einfache hypothetische Anwendung, in der Benutzer Beiträge lesen oder schreiben können.

Einige Benutzer können Artikel lesen und schreiben, während andere nur sie lesen können. Mit Spring Security (3.2.1) modellierte ich dies mit zwei Rollen:

  • ROLE_WRITE: Diese Rolle gewährt Benutzern Zugriff auf das Schreiben von Beiträgen.
  • ROLE_READ: Diese Rolle gewährt Benutzern Zugriff auf Beiträge zum Lesen.

Dies mit Spring-Sicherheit zu implementieren, ist ziemlich einfach ...

Jetzt möchte ich auch Apps von Drittanbietern gestatten, im Auftrag von Benutzern Beiträge zu lesen und zu schreiben, indem ein OAuth2-Anbieter mit Spring Security OAuth (Version 2.0.0.M3 ATM) implementiert wird.

Während des Autorisierungsschritts fragt die App den Benutzer, ob er bereit ist, das Recht zum Lesen und/oder Schreiben von Posts in seinem Namen zu gewähren. Der Benutzer gewährt hier Bereiche (keine Rollen).

Wenn der OAuth2-Consumer dann meine REST-API anruft, autorisiert Spring Sec OAuth das erteilte Token und erstellt eine Authentifizierung, die den Benutzer mit all seinen Rollen und nur den gewährten Bereichen enthält.

Das Problem (und die Frage) ist, dass ich jetzt eine andere Sicherheitslogik schreiben muss, abhängig davon, ob die API von einem normalerweise authentifizierten Benutzer aufgerufen wird (überprüfen Sie die Rollen) oder ob sie über OAuth2 aufgerufen wird (Rollen + Bereiche prüfen).

Ist es möglich, die Konzepte von Rollen und Gültigkeitsbereichen in Spring Security OAuth2 "zusammenzuführen", so dass der Benutzer der App während des Autorisierungsschritts eine Untermenge der Rollen übergibt (und nur den Bericht "OAuth2-Authentifizierung" hat) diese in den gewährten Behörden)? Wenn die App eines Drittanbieters einen API-Aufruf durchführt, werden die Rollen für die Authentifizierung gewährt. Auf diese Weise muss ich keine OAuth2-spezifische Sicherheitslogik schreiben.

18
Christophe L

Gültigkeitsbereiche (und Rollen) sind beliebige Zeichenfolgen. Es besteht also kein Problem, wenn Sie dann dieselben Werte erstellen möchten. Um die Zugriffsregeldeklarationen identisch zu machen, können Sie eine ExpressionHandler schreiben, die Behörden oder Bereiche mit den gleichen Werten testet, abhängig vom Typ der gefundenen Authentication.

Nachdem Sie die Kommentare gelesen haben, bietet sich ein anderer Ansatz an: Fügen Sie eine benutzerdefinierte TokenStore oder ResourceServerTokenServices hinzu. Hierbei handelt es sich um leicht zugängliche Erweiterungspunkte, die es ermöglichen würden, den OAuth2Authentication so zu ändern, dass die ihm erteilten Berechtigungen den Geltungsbereichen entsprechen.

Meine Präferenz ist jedoch, die zulässigen Bereiche mit einem OAuth2RequestFactory zu steuern, wobei sie an der Stelle der Tokenzuteilung auf Werte begrenzt werden, die mit den Berechtigungen des Benutzers übereinstimmen.

6
Dave Syer

Sie können Ihren eigenen AccessTokenConverter (hauptsächlich für JWT) konfigurieren und die gewünschten Ansprüche aus dem JWT-Zugriffstoken extrahieren und ein Berechtigungsobjekt generieren. Definieren Sie einfach eine Bean-Factory, die einen AccessTokenConverter zurückgibt

0
sciack