Worum es geht
Eine Rolle kann auf drei Arten an einer Person hängen. Zwei Fragen legen die Art fest, und sie sind voneinander unabhängig:
- Welche Ebene in Keycloak? Hat die Rolle keinen Client, ist sie eine Realm-Rolle. Sonst ist sie eine Client-Rolle des Clients, zu dem sie gehört.
- Welche Reichweite? Eine Vergabe mit Scope
PLATFORMhängt direkt am Konto. Eine mit ScopeTENANThängt an der Organisation des Mandanten.
Die drei Ebenen
| Realm-Rolle | Client-Rolle global | Client-Rolle in der Organisation | |
|---|---|---|---|
| Vergeben an | das Konto, realmweit | das Konto, für einen Client | die Mitgliedschaft in einer Organisation |
| Steht im Token unter | realm_access.roles | resource_access.<client>.roles | organization.<alias>.resource_access.<client>.roles |
| Gilt | immer und überall | überall, wo die Person keinen dynamischen Mandanten mit eigenen Rollen hat | nur im Mandanten dieser Organisation |
| Typische Rollen | platform-admin, user, die zwei Wechselrollen, declaration-reader | Rollen in statischen Mandanten | Rollen in dynamischen Mandanten, etwa tenant-admin |
| Wer liest sie | Plattformprüfungen: Administrator, Wechsel, Lesen der Deklaration | das Modul dieses Clients | das Modul dieses Clients, wenn die Anfrage in diesem Mandanten läuft |
So sieht es im Token aus
{
"realm_access": {
"roles": ["user", "allowed-tenant-context-switch"]
},
"resource_access": {
"cdms-backend": { "roles": ["report-read"] }
},
"organization": {
"nordbau": {
"id": "b7e0…",
"resource_access": {
"cdms-backend": { "roles": ["order-edit", "tenant-admin"] }
}
}
}
}Anfrage läuft in nordbau, Client cdms-backend:
Realm-Rollen: user, allowed-tenant-context-switch
Geschäftsrollen: order-edit, tenant-admin
(report-read gilt hier NICHT)report-read fehlt in nordbau, weil die Organisation eigene Rollen trägt. Diese ersetzen die globalen Client-Rollen, sie werden nicht mit ihnen gemischt. Trägt eine Organisation gar keine Rollen, gelten die globalen weiter. Die ganze Regel steht unter Effektive Rollen: global oder im Mandanten.
Wie CIAS eine Rolle in Keycloak einträgt
| Rolle | Scope | Was CIAS in Keycloak tut |
|---|---|---|
| Realm-Rolle | PLATFORM | trägt die Rolle direkt am Konto ein |
| Client-Rolle | PLATFORM | trägt die Client-Rolle direkt am Konto ein |
| Client-Rolle | TENANT | macht die Person Mitglied einer Gruppe in der Organisation, die <client>:<rolle> heißt und die Rolle trägt |
| Realm-Rolle | TENANT | macht die Person Mitglied einer Gruppe in der Organisation, die nach der Rolle heißt |
Keycloaks Organisationen haben keine eigenen Rollen, nur Gruppen. Eine Mandantenrolle ist deshalb immer: eine Gruppe in der Organisation, die Rolle an dieser Gruppe, die Person als Mitglied. Der Name <client>:<rolle> verhindert, dass zwei Module mit gleichem Rollennamen sich eine Gruppe teilen.
Ein angenehmer Nebeneffekt: Eine Rolle über eine Organisationsgruppe steht nie in den direkten Realm-Rollen der Person. Eine Organisation kann also die globalen Rollen nicht erweitern.
Wer welche Ebene liest
- Realm-Rollen liest CIAS selbst: Ist die Person Plattform-Administrator? Darf sie den Mandanten oder die Person wechseln? Kein Mandant kann Realm-Rollen hinzufügen. Sonst könnte, wer einen Mandanten verwaltet, sich Plattformrechte geben.
- Client-Rollen liest das Modul des Clients, also jede Anwendung ihre eigenen. Die Rollen anderer Clients übergeht die Filterkette, auch wenn sie im Token stehen.
Die Falle mit globalen Client-Rollen
Eine Client-Rolle mit Scope PLATFORM landet in resource_access. Dort stehen aber auch die gewöhnlichen Rollen eines statischen Mandanten. Für eine Person in einem dynamischen Mandanten, dessen Organisation Rollen trägt, wird genau dieser Teil ersetzt. Die Vergabe stünde im Token, gälte aber nie.
CIAS lehnt deshalb ab, eine Client-Rolle mit Scope PLATFORM an eine Person zu vergeben, deren Heimatmandant eine Organisation hat: 403 cias.authorization.denied. Aus demselben Grund darf ein Modul keine Plattformrollen anmelden.