Worum es geht
Module melden ihre Rollen und Attribute an, siehe Module melden ihre Rollen an. Damit daraus etwas wird, muss jemand Keycloak und den Katalog auf den Stand bringen. Das macht der Abgleich. Er schreibt drei Dinge:
- das Benutzerprofil in Keycloak: welche Attribute ein Konto haben kann
- die Client-Rollen und die Claim-Mapper je Modul. Ein Claim-Mapper sorgt dafür, dass ein Attribut im Token des Clients ankommt
- den Katalog in CIAS
Wann er läuft
| Anlass | Wie | Wer |
|---|---|---|
| beim Start | nach dem Hochfahren, wenn codamai.cias.authorization.startup.enabled=true | die Anwendung selbst |
| auf Anforderung | POST /cias/admin/roles/reconcile | nur ein Plattform-Administrator, sonst 403 |
Einen Zeitgeber gibt es bewusst nicht. Das Benutzerprofil ist in Keycloak ein Dokument, das bei jedem Schreiben ganz ersetzt wird. Zwei Läufe gleichzeitig würden sich gegenseitig überschreiben. Innerhalb eines Prozesses läuft deshalb immer nur ein Lauf: Wer drückt, während einer läuft, bekommt einen Bericht „läuft bereits“ zurück, und es passiert nichts doppelt.
Beim Start legt CIAS vor dem Abgleich noch die Realm-Rollen an, die die Installation in ihrer Konfiguration nennt (startup.realm-roles, etwa user). Die kommen nie aus einer Deklaration.
Drei Phasen: lesen, ablehnen, schreiben
-
1CIASlesen: jede konfigurierte Deklaration abfragen; ein nicht erreichbares Modul wird vermerkt und sonst in Ruhe gelassen
-
2CIASablehnen: fehlerhafte Deklarationen fallen heraus, Widersprüche bei Attributen stoppen den ganzen Lauf, Schlüsselkollisionen ihren Client
-
3CIAS→Keycloakschreiben 1: das Benutzerprofil, einmal für alle Module
-
4CIAS→Keycloakschreiben 2: je Modul fehlende Client-Rollen anlegen, dann die Claim-Mapper
-
5CIASschreiben 3: je Modul den Katalog, in einer eigenen TransaktionErgebnis: Ein Bericht je Modul: was angelegt, geändert, stillgelegt, wieder aufgenommen wurde
Erst alles lesen, dann alles prüfen, dann schreiben. Ein Lauf, der beim Lesen schon schriebe, würde eine widersprüchliche Konfiguration halb anwenden, und niemand wüsste hinterher, welche Hälfte. Die Ablehnungen im Einzelnen stehen unter Wenn CIAS eine Deklaration nicht annimmt.
Zuerst Keycloak, dann der Katalog
Keycloak und CIAS haben keine gemeinsame Transaktion. Scheitert etwas zwischen beiden, bleibt eine Hälfte allein stehen. Die Reihenfolge entscheidet, welche:
Wann: Die Rolle ist in Keycloak angelegt, der Katalog wird nicht mehr geschrieben.
Eine Rolle ohne Inhaber in Keycloak ändert für niemanden etwas. Der nächste Lauf trägt sie in den Katalog nach.
Ergebnis: harmlos
Wann: Die Rolle steht im Katalog, fehlt aber in Keycloak.
Ein Administrator vergibt sie, CIAS speichert die Vergabe, und das Token trägt die Rolle trotzdem nicht.
Ergebnis: ein Recht, das CIAS anbietet und nicht liefern kann
Scheitert das Anlegen in Keycloak für ein Modul, meldet der Bericht es als UNPROVISIONED, und sein Katalog bleibt unverändert, auch Umbenennungen und Stilllegungen. Der nächste Lauf holt alles auf einmal nach, denn jeder Schritt lässt sich wiederholen.
Was mit den Rollen eines Moduls passiert
Wann: Das Modul meldet order-export an, der Katalog kennt sie nicht.
Angelegt in Keycloak, eingetragen im Katalog: Eigentümer das Modul, Scope TENANT, Delegation aus der Konfiguration der Installation.
Ergebnis: im Bericht unter defined
Wann: Das Modul meldet order-edit mit neuem Anzeigenamen an.
Anzeigename und Anzeigegruppe werden übernommen. Beschreibung und Delegation bleiben, wie ein Administrator sie gesetzt hat. Dazu sagt das Modul nichts.
Ergebnis: im Bericht unter updated
Wann: Das Modul meldet order-archive nicht mehr an.
Die Rolle wird stillgelegt, mit Datum und Uhrzeit. Sie bleibt in Keycloak, alle Vergaben bleiben. Neu vergeben lässt sie sich nicht mehr.
Ergebnis: im Bericht unter deprecated
Wann: Das Modul meldet eine stillgelegte Rolle wieder an.
Die Stilllegung wird aufgehoben. Die Vergaben waren nie weg, es muss nichts zurückgegeben werden.
Ergebnis: im Bericht unter reinstated
Wann: Das Modul antwortet nicht.
Nichts ändert sich, auch keine Stilllegung. Eine Rolle wird nie stillgelegt, nur weil ihr Dienst gerade neu startet.
Ergebnis: UNREADABLE
Warum stilllegen statt löschen: Würde CIAS eine zurückgezogene Rolle löschen, verlöre jede Person, die sie hat, ihr Recht, nur weil ein Modul seine Liste aufgeräumt hat. Und niemand könnte später nachsehen, dass es die Rolle je gab.
Stillgelegt wird nur, was diesem Modul gehört. Tragen mehrere Module einen Client, legt das Schweigen des einen nie die Rollen des anderen still. Rollen ohne Eigentümer, etwa die Realm-Rollen der Installation, legt kein Abgleich still.
Attribute
Für Attribute gilt dasselbe Prinzip, nur strenger:
- Ein Attribut, das kein Modul mehr anmeldet, bleibt im Benutzerprofil. Löschen würde den Wert in jedem Konto vernichten. Eine Rolle ist ein Recht, ein Attribut ist Inhalt.
- Ein Pflichtattribut ohne Standardwert lehnt CIAS ab, samt der ganzen Deklaration dieses Moduls. Konten, die es schon vorher gab, hätten sonst keinen Wert. Das Profil würde dann behaupten, so etwas könne es nicht geben, und Keycloak lehnte danach sogar Änderungen an diesen Konten ab, auch das Sperren.
Mehr unter Attribute anmelden.
Der Bericht
POST /cias/admin/roles/reconcile
Authorization: Bearer <Token eines Plattform-Administrators>{
"applied": true,
"modules": [
{ "module": "cias", "client": "cias-backend", "status": "RECONCILED",
"provisioned": [], "defined": [], "updated": [],
"deprecated": [], "reinstated": [], … },
{ "module": "cdms", "client": "cdms-backend", "status": "RECONCILED",
"provisioned": ["cdms-backend/order-export"],
"defined": ["cdms-backend/order-export"],
"deprecated": ["cdms-backend/order-archive"], … }
],
"attributes": [],
"refusals": []
}| Status | Bedeutung |
|---|---|
RECONCILED | gelesen, in Keycloak angelegt, Katalog geschrieben |
UNPROVISIONED | Anlegen in Keycloak gescheitert, Katalog unverändert |
UNREADABLE | Modul nicht abfragbar, nichts verändert |
REJECTED | Deklaration nicht annehmbar, nichts davon angewendet |
REFUSED | Schlüsselkollision auf dem Client, an diesem Client nichts geschrieben |
SKIPPED | der ganze Lauf hat nichts geschrieben, der Grund steht in refusals |
Rollen stehen im Bericht immer als client/key, denn der Schlüssel allein sagt nicht mehr, welche Rolle gemeint ist.