Worum es geht
Eine Rolle zu vergeben heißt: Eine Person bekommt ein Recht, meist in einem bestimmten Mandanten. CIAS speichert dazu eine Vergabe und trägt die Rolle in Keycloak ein. Beim nächsten Token hat die Person die Rolle.
Bevor das passiert, prüft CIAS, ob der Aufrufer das überhaupt darf.
Der Aufruf
POST /cias/admin/role-assignments
Authorization: Bearer <Token von Anna, tenant-admin in nordbau>
{
"userId": "5c9e…",
"roleClient": "cias-backend",
"roleKey": "tenant-user",
"tenantKey": "nordbau",
"validFrom": null,
"validUntil": null,
"reason": "neue Kollegin im Einkauf"
}HTTP 200
{
"id": "a41f…",
"userId": "5c9e…",
"roleClient": "cias-backend",
"roleKey": "tenant-user",
"scope": "TENANT",
"tenantKey": "nordbau",
"validFrom": null,
"validUntil": null,
"state": "ACTIVE",
"grantedBy": "nordbau",
"reason": "neue Kollegin im Einkauf"
}| Feld | Bedeutung |
|---|---|
userId | die ID des Benutzerdatensatzes in CIAS, nicht der Keycloak-sub |
roleClient, roleKey | die Rolle, wie im Katalog. Leerer Client = Realm-Rolle |
tenantKey | Pflicht bei einer Mandantenrolle, verboten bei einer Plattformrolle |
validFrom, validUntil | optional, siehe Befristete Rollen |
reason | warum, für das Audit |
Die Prüfungen der Reihe nach
-
CIASRolleGibt es die Rolle im Katalog, und ist sie nicht stillgelegt?↳ nein 404
cias.authorization.role-not-foundbzw. 409cias.authorization.role-deprecated -
CIASAngemeldetHat die Anfrage ein gültiges Token?↳ nein 403
-
CIASPlattform-Administrator?ja → alle weiteren Rechteprüfungen entfallen
-
CIASMandantenrolleHat die Rolle den Scope
TENANT? Plattformrollen werden nie delegiert↳ nein 403 -
CIASDelegationSteht eine Rolle des Aufrufers in
assignableBy?↳ nein 403 -
CIASEigener MandantIst
tenantKeyder Mandant aus dem Token des Aufrufers?↳ nein 403 -
CIASObergrenzeHält der Aufrufer die Rolle selbst, in diesem Mandanten oder global?↳ nein 403
- Vergabe erlaubt
Danach prüft CIAS noch die empfangende Person und den Mandanten:
- Eine Client-Rolle mit Scope
PLATFORMan eine Person, deren Heimatmandant eine Organisation hat: 403. Die Rolle stünde im Token, aber keine Anfrage würde sie lesen, siehe Realm-Rolle, Client-Rolle, Organisationsrolle. - Eine Mandantenrolle in einem Mandanten ohne Organisation, also einem statischen Mandanten: 403. Eine Mandantenrolle hängt in Keycloak an der Organisation. CIAS weicht nie auf eine globale Vergabe aus, denn so würde aus einer Mandantenrolle aus Versehen eine Plattformrolle.
Alle Ablehnungen der Rechteprüfung sehen gleich aus: 403 cias.authorization.denied mit dem Text not permitted. Den genauen Grund schreibt CIAS ins Log.
Die Entscheidungstabelle
| Aufrufer | Scope der Rolle | delegiert an eine Rolle des Aufrufers | Mandant der Vergabe | Aufrufer hält die Rolle dort | Ergebnis |
|---|---|---|---|---|---|
| Plattform-Administrator | – | – | – | – | erlaubt |
| jemand anderes | PLATFORM | – | – | – | 403 |
| jemand anderes | TENANT | nein | – | – | 403 |
| jemand anderes | TENANT | ja | ein anderer als der eigene | – | 403 |
| jemand anderes | TENANT | ja | der eigene | nein | 403, die Obergrenze greift |
| jemand anderes | TENANT | ja | der eigene | ja | erlaubt |
Der eigene Mandant kommt aus dem Token des Aufrufers, nie aus der Anfrage. Sonst könnte jeder Mandanten-Administrator eine delegierte Rolle in jedem fremden Mandanten vergeben. Wie die Obergrenze zählt, steht unter Die Obergrenze: niemand vergibt mehr, als er hat.
Der Ablauf, wenn alles stimmt
sequenceDiagram
participant A as Anna (tenant-admin)
participant C as CIAS
participant DB as CIAS-Datenbank
participant K as Keycloak
A->>C: POST /cias/admin/role-assignments
C->>C: Rolle, Delegation, Mandant, Obergrenze prüfen
C->>DB: gibt es schon eine laufende Vergabe? sonst speichern (ACTIVE)
C->>K: Person in Gruppe cias-backend:tenant-user der Organisation nordbau
C-->>A: 200 mit der Vergabe, Event Granted
Erst die Vergabe speichern, dann Keycloak. Scheitert Keycloak, steht in CIAS mehr, als das Token trägt. Das verweigert eher, als dass es zu viel erlaubt, und ein zweiter Aufruf holt es nach.
Der Aufruf lässt sich gefahrlos wiederholen: Gibt es für diese Person, diese Rolle und diesen Mandanten schon eine laufende Vergabe, legt CIAS keine zweite an. Zwei laufende Vergaben einer Rolle hätten zwei Enddaten, und niemand wüsste, welches gilt. Mit gleichem Zeitfenster und Grund liefert CIAS die bestehende zurück, mit anderem übernimmt die bestehende das neue, siehe Befristete Rollen.
Wie die Rolle in Keycloak eingetragen wird, hängt von Ebene und Scope ab, siehe Realm-Rolle, Client-Rolle, Organisationsrolle.
Varianten
Wann: Das Token trägt eine Rolle, die die Installation als Plattform-Administrator zählt, im eigenständigen CIAS platform-admin.
Delegation, eigener Mandant und Obergrenze entfallen. Ein Plattform-Administrator hält jedes Recht, er erfüllt die Obergrenze also, statt von ihr ausgenommen zu sein.
Ergebnis: Jede nicht stillgelegte Rolle, in jedem Mandanten oder global.
Wann: Anna hat tenant-admin in nordbau und vergibt tenant-user in nordbau.
tenant-user ist im eigenständigen CIAS an tenant-admin delegiert. Anna hält tenant-user selbst in nordbau.
Ergebnis: erlaubt
Wann: Anna hat tenant-owner und tenant-admin in nordbau und vergibt tenant-admin an Ben.
tenant-admin ist an tenant-owner delegiert, und Anna hält tenant-admin selbst.
Ergebnis: erlaubt
Wann: Ben hat tenant-admin, aber nicht tenant-owner, und will tenant-admin weitergeben. Oder jemand im Mandanten will tenant-owner vergeben.
tenant-admin ist nur an tenant-owner und platform-admin delegiert, tenant-owner nur an platform-admin.
Ergebnis: 403
Wann: Eine Rolle ist an tenant-admin delegiert, Anna hält sie aber selbst nicht.
Delegation sagt, wer weitergeben darf, die Obergrenze, wie viel. Beides muss stimmen.
Ergebnis: 403
Wann: Anna vergibt tenant-user mit tenantKey: suedlogistik.
Ihr Token nennt nordbau.
Ergebnis: 403
Wann: Eine Mandantenrolle soll im statischen Mandanten stadtwerke-nord vergeben werden.
Ohne Organisation gibt es in Keycloak keinen Ort für eine Mandantenrolle.
Ergebnis: 403, auch für einen Plattform-Administrator
Vergaben ansehen
| Aufruf | Liefert |
|---|---|
GET /cias/admin/role-assignments?userId=… | alle Vergaben einer Person, auch beendete |
GET /cias/admin/tenants/{tenantKey}/role-assignments | alle Vergaben in einem Mandanten |
GET /cias/admin/roles/assignable | die Rollen, die du grundsätzlich vergeben darfst, ohne stillgelegte |