Worum es geht
Im Token einer Person können Rollen an zwei Stellen stehen:
- global unter
resource_access.<client>.roles: Diese Rollen gelten überall. - im Mandanten im Organisations-Claim unter
organization.<alias>.resource_access.<client>.roles: Diese Rollen gelten nur, wenn die Anfrage in diesem Mandanten läuft.
Bei jeder Anfrage bildet CIAS daraus die effektiven Rollen: die Rollen, die für genau diese Anfrage gelten. CDMS prüft nur gegen diese.
Warum ersetzen statt addieren? Eine global vergebene Rolle hat niemand für diesen einen Mandanten vergeben. Würde sie mitgelten, könnte ein Recht aus einem Zusammenhang in einen Mandanten „durchsickern“, für den es nie gedacht war. Ein Mandant, der eigene Rollen führt, bestimmt deshalb allein, welche Fachrollen in ihm gelten.
Die Entscheidung
| Mandant der Anfrage dynamisch? | Person hat dort Rollen, egal für welchen Client? | effectiveUserRoles |
|---|---|---|
| nein | – | die globalen Client-Rollen |
| ja | nein | die globalen Client-Rollen |
| ja | ja | nur die Rollen im Mandanten, für den eigenen Client, dazu die Realm-Rollen, die die Organisation vergibt |
Die Realm-Rollen aus realm_access.roles stehen in jedem Fall unverändert in effectiveUserRealmRoles.
Vorher und nachher
flowchart LR
subgraph V["Im Token"]
direction TB
G1["global:<br/>hr-employee-read<br/>report-read"]
O1["im Mandanten nordbau:<br/>hr-employee-edit"]
R1["Realm:<br/>allowed-tenant-context-switch"]
end
subgraph N["Effektiv in nordbau"]
direction TB
E1["Fachrollen:<br/>hr-employee-edit"]
E2["Realm-Rollen:<br/>allowed-tenant-context-switch"]
end
O1 --> E1
R1 --> E2
G1 -. "fallen weg" .-> N
Die vier Ausprägungen
Wann: Statischer Mandant, SINGLE, oder die Person gehört keiner Organisation an.
Die Fachrollen sind die globalen Client-Rollen des eigenen Clients. Einen Organisations-Claim gibt es nicht oder er zählt nicht.
Ergebnis: effectiveUserRoles = resource_access.<client>.roles
Wann: Dynamischer Mandant, aber in der Organisation hat die Person keine Rollen.
Die Organisation bestimmt nur den Mandanten, nicht die Rollen. Es gelten die globalen Client-Rollen. Deshalb nimmt das bloße Einschalten der Organisationen in Keycloak niemandem seine Rechte.
Ergebnis: effectiveUserRoles = globale Client-Rollen
Wann: Dynamischer Mandant, und in der Organisation hat die Person Rollen.
Die Rollen im Mandanten ersetzen die globalen. Aus dem Organisations-Claim zählt nur der eigene Client: Der Claim enthält die Mandanten-Rollen aller Clients, und die anderen gehen dieses Deployment nichts an.
Ergebnis: effectiveUserRoles = Rollen im Mandanten für den eigenen Client
Wann: immer
Realm-Rollen wie platform-admin, allowed-tenant-context-switch oder allowed-user-context-switch gelten immer, in jedem Mandanten. Eine Organisation kann ihnen nichts hinzufügen. Sonst könnte, wer einen Mandanten verwaltet, sich Plattformrechte geben.
Ergebnis: effectiveUserRealmRoles = realm_access.roles
Und die Attribute?
Für Attribute gilt dasselbe Muster. Ist ein Attribut pro Mandant angemeldet, holt CIAS den Wert für den aktiven Mandanten und ersetzt damit den Wert aus dem Token. Kann CIAS den Wert nicht abrufen, lehnt es die Anfrage ab, statt auf den Wert im Token zurückzufallen. Siehe Ein Wert pro Person oder pro Mandant.
Und nach einem Benutzerwechsel?
Nach einem Benutzerwechsel mit dem Header user-roles: target bildet CIAS die effektiven Rollen für die Zielperson, nach denselben Regeln wie oben. Ist sie Mitglied der Organisation des Mandanten und trägt die Mitgliedschaft Rollen, ersetzen diese ihre globalen Client-Rollen. Ihre Realm-Rollen gelten wie immer. Ohne user-roles: target bleiben die effektiven Rollen die der angemeldeten Person.
Weiter
- Die zwei Rechte-Matrizen
- Realm-Rolle, Client-Rolle, Organisationsrolle
- Modellrollen: wie CDMS die effektiven Rollen prüft