Spring boot mit Keyclaok rollen basiert

jawiner

Mitglied
Hallo zusammen,

ich versuche gerade meinen Spring boot rest service ResourceService mit keycloak abzusichern. Jetzt brauche ich aber in meinem Service die Rollen Information des Users. Leider bekomme ich in den Scopes lediglich die client scopes, nicht aber die user roles, die stehen im keycloak token unter realm_access->roles.

Ich habe folgendes gefunden, um die Rollen über hasRole von spring abzufragen, aber dann sind die scopes weg.

Vielleicht habe ich auch noch nicht ganz verstanden wo der unterschied von scopes und roles sind.

Gibt es denn eine Möglichkeit scopes und roles zu verbinden, oder sollte ich besser mit scopes arbeiten. Wenn mit scopes, wie bekomme ich die User roles mit in die scopes?

Hoffentlich versteht ihr was ich meine.

VG
jawiner
 
Wie macht man das denn normalerweise, wenn man einen Service hat bei dem ein User je nach Rolle mehr oder weniger darf.
Wenn man das eigentlich mit Scopes macht, dann müsste ich doch z.b. ein service-admin oder service-user scope haben, oder?

Ich denke das ist ja ein oauth Verständnisproblem ist, ich kann mir nicht vorstellen das keycloak das anders implementiert hat, als ein anderer Identity Manager.
 
Mein aktueller Stand:

In oauth gibt es 4 rollen
  • resource owner
    Ist etwas, das Zugriff auf die resource genehmigen kann. In meinem Fall der User.
  • resource server
    Ist der server, der die Daten des resource owners verwaltet und ggf. zur Verfügung stellt.
  • client
    Die Applikation, die stellvertretend für den resource owner, die Daten beim resource server anfrägt. In meinem Fall das Frontend.
  • authorization server
    Der Server, bei dem sich der client den access token abholt. In meinem Fall keycloak.
Soweit so gut, das habe ich (glaub ich zumindest) verstanden.

Jetzt zu dem Teil den ich immer noch nicht verstehe.
In keycloak gibt es die Möglichkeit Realm Rollen anzulegen, diese kann ich dann relativ einfach einem User zuweisen und bekomme diese auch im resource server ausgewertet (wie im 1. Post). Allerdings sind diese Rollen wie gesagt Realm Rollen, das heißt, sollte ich dann später eine andere Applikation (ich meine hier eine resource server/client kombination die nichts mit der alten zu tun hat, aber die gleiche User base haben soll) hinzufügen, ist der User mit der Rolle admin, auch bei dieser Applikation ein Admin, was ich aber separate für diese Applikation eintstellen können möchte.
Jetzt gibt es in keycloak auch die Möglichkeit der Client Roles, also User A bekommt beim Client A die Rolle admin. Damit wäre dann zwar der Fall von oben verhindert, hier habe ich dann aber folgende Problemen.
  • Da die Rolle client bezogen ist, taucht sie dann im Token auch unter diesem client auf. Jetzt muss der resource server nach der Rolle unter dem client suchen, somit muss der resource server den client kennen, was sich für mich falsch anfühlt.
  • Auch wenn ich später weitere clients hinzufüge, muss ich ...
    1. ... bei jedem client den user wieder mit der Rolle verbinden.
    2. ... dem resource server alle clients bekannt machen die zu dieser Applikation gehören (Web, Mobile, etc).
Ich könnte natürlich auch einfach einen client für den resource server anlegen und die Rolle dort zuweisen, dann müsste der resource server einfach nur nach seinem eigenem Namen suchen, aber das fühlt sich ebenfalls nicht richtig an. Auch hätte ich dann das Problem, dass ich im Falle von 3rd party clients keine Restriktionen einbauen kann, oder doch?

Ich habe mir auch API's von anderen Anbietern angesehen. Diese machen das, so wie ich das sehen konnte, komplett über die Scopes.
Ich müsste für meine Lösung vermutlich Scopes in das Token übertragen, die die Client Roles des Users berücksichtigen, oder?

Hier aber noch was ich eigentlich machen möchte:

Ich möchte eine Reihe von Applikationen, die außer den Usern nichts miteinander zu tun haben, über einen externen Identity Manager absichern. Damit ich für all diese Applikationen ein Single Sign On realisieren kann.
Jetzt kann ein User entweder auf alle oder eben nur auf einzelne Applikation Zugriff haben. Auch kann ein User bei einer Applikation normaler User und bei einer anderen Admin sein. Eine Applikation besteht immer aus mindestens einem Client (spring boot web frontend) und einem resource server (spring boot rest service). Die clients könne allerdings von der Anzahl pro Applikation variieren, also kann z.B. auch ein client für Mobile oder diverse 3rd Party clients dazu kommen.

Vielleicht hat ja der ein oder andere eine Meinung dazu. Würde mir sicher sehr helfen.
 

Zurück
Oben