CodamAIDocs
Themafertig

Eine Rolle vergeben

Wer darf vergeben? Plattform-Administrator immer, sonst nur mit Delegation, Obergrenze und im selben Mandanten. Der Ablauf mit allen Ablehnungen.

Ausprägungen
Plattform-AdministratorMandanten-Administrator mit Delegationohne Delegation → 403über der Obergrenze → 403anderer Mandant → 403Mandant ohne Organisation → abgelehnt

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

Anfrage
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"
}
Antwort
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"
}
FeldBedeutung
userIddie ID des Benutzerdatensatzes in CIAS, nicht der Keycloak-sub
roleClient, roleKeydie Rolle, wie im Katalog. Leerer Client = Realm-Rolle
tenantKeyPflicht bei einer Mandantenrolle, verboten bei einer Plattformrolle
validFrom, validUntiloptional, siehe Befristete Rollen
reasonwarum, für das Audit

Die Prüfungen der Reihe nach

Darf dieser Aufrufer diese Rolle hier vergeben?
  1. CIAS
    Rolle
    Gibt es die Rolle im Katalog, und ist sie nicht stillgelegt?
    ↳ nein 404 cias.authorization.role-not-found bzw. 409 cias.authorization.role-deprecated
  2. CIAS
    Angemeldet
    Hat die Anfrage ein gültiges Token?
    ↳ nein 403
  3. CIAS
    Plattform-Administrator?
    ja → alle weiteren Rechteprüfungen entfallen
  4. CIAS
    Mandantenrolle
    Hat die Rolle den Scope TENANT? Plattformrollen werden nie delegiert
    ↳ nein 403
  5. CIAS
    Delegation
    Steht eine Rolle des Aufrufers in assignableBy?
    ↳ nein 403
  6. CIAS
    Eigener Mandant
    Ist tenantKey der Mandant aus dem Token des Aufrufers?
    ↳ nein 403
  7. CIAS
    Obergrenze
    Hält der Aufrufer die Rolle selbst, in diesem Mandanten oder global?
    ↳ nein 403
  8. Vergabe erlaubt

Danach prüft CIAS noch die empfangende Person und den Mandanten:

  • Eine Client-Rolle mit Scope PLATFORM an 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

Wer darf eine Rolle vergeben?
AufruferScope der Rolledelegiert an eine Rolle des AufrufersMandant der VergabeAufrufer hält die Rolle dortErgebnis
Plattform-Administrator––––erlaubt
jemand anderesPLATFORM–––403
jemand anderesTENANTnein––403
jemand anderesTENANTjaein anderer als der eigene–403
jemand anderesTENANTjader eigenenein403, die Obergrenze greift
jemand anderesTENANTjader eigenejaerlaubt

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

Wer vergibt was

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

AufrufLiefert
GET /cias/admin/role-assignments?userId=…alle Vergaben einer Person, auch beendete
GET /cias/admin/tenants/{tenantKey}/role-assignmentsalle Vergaben in einem Mandanten
GET /cias/admin/roles/assignabledie Rollen, die du grundsätzlich vergeben darfst, ohne stillgelegte

Fallen

Weiter

Quellen im Code und in der Wissensdatenbank
  • CIAS/cias-authorization – RoleAssignmentService (grant, authorize, refuseAnInvisibleGlobalGrant, pushGrant, organization), ConferralCeiling (mayConfer, heldBy), RoleAssignment.grant, GrantRoleCommand
  • CIAS/cias-authorization – RoleAdminController (POST /cias/admin/role-assignments, GET /cias/admin/role-assignments, GET /cias/admin/tenants/{tenantKey}/role-assignments), AuthorizationRestDtos.GrantRequest, AuthorizationExceptionHandler, RoleAssignmentView, AuthorizationEvent.Granted
  • CIAS/cias-registration – RegistrationService.grantRoles (Startrollen direkt in Keycloak)
  • CIAS/cias-runtime – CiasPlatformAdministratorConfiguration, CiasDeclaredRoleDelegationConfiguration
  • CIAS/cias-authorization/docs/adr – ADR-018, ADR-023, ADR-031, ADR-043
Suchen