Worum es geht
Ben aus dem Mandanten nordbau meldet: „Ich sehe meine Aufträge nicht mehr.“ Lena arbeitet im Plattform-Support. Ihr eigener Mandant ist codamic, in nordbau ist sie kein Mitglied. Trotzdem soll sie nachsehen können, ohne sich ein Konto beim Kunden anlegen zu lassen.
Dafür gibt es zwei Header, die ein Client mitschicken kann:
tenant: Die Anfrage läuft in einem anderen Mandanten.user: Die Anfrage läuft im Namen einer anderen Person. Mit dem Zusatz-Headeruser-roles: targetauch mit deren Rollen.
Beide Header kann jeder setzen, also entscheidet nicht der Header, sondern das signierte Token. Jeder der beiden Wechsel hat seine eigene Realm-Rolle, also eine Rolle, die in Keycloak für die ganze Plattform gilt und die keine Organisation vergeben kann.
Was vorher eingerichtet sein muss
| Was | Wo | Warum |
|---|---|---|
Realm-Rolle allowed-tenant-context-switch | direkt in Keycloak am Konto von Lena | erlaubt überhaupt einen Wechsel in einen fremden Mandanten |
nordbau im Attribut allowedTenants | am Konto von Lena | sagt, welche Mandanten sie erreichen darf |
Realm-Rolle allowed-user-context-switch | direkt in Keycloak | nur nötig, wenn Lena auch die Person wechseln soll |
Bens Freigabe für Lena in nordbau | Ben bestätigt Lenas Antrag oder erteilt sie selbst, siehe unten | ohne sie endet jeder Benutzerwechsel zu Ben mit 403 user-switch-not-consented |
Ben ist Mitglied von nordbau | Organisation nordbau, oder Bens Attribut tenant bzw. allowedTenants | in eine Person außerhalb des Ziel-Mandanten wird nicht gewechselt |
| Nachfrage nach der Zielperson | nur wenn CDMS und CIAS getrennt laufen, siehe Benutzerwechsel per Header | ohne sie endet jeder Benutzerwechsel mit 403 |
| Fachrollen für die Modelle, in die sie schauen will | im Rollenkatalog, an Lena vergeben | ohne sie lehnt CDMS jedes Modell ab |
Die beiden Wechselrollen stehen in keinem Rollenkatalog und werden nicht über CIAS vergeben. Mehr dazu unter Die Realm-Rollen der Plattform.
Vorher: Ben gibt frei
Die Rolle allowed-user-context-switch erlaubt Lena, überhaupt die Person zu wechseln. Zu wem, entscheidet die Zielperson. Ben muss Lena den Wechsel freigeben, für nordbau, für den Modus und für eine begrenzte Zeit.
-
1Client→CIASLena schickt
POST /cias/me/switch-requestsmittarget: 3f2a…,mode: target,validUntil(etwa in zwei Tagen) undreason: Ticket 4711. Ihr Token läuft dafür im Mandantennordbau. -
2CIASlegt den Antrag an und schickt Ben eine Mail: wer fragt, mit wessen Rechten, bis wann und warum
-
3Client→CIASBen bestätigt in seinem Portal:
POST /cias/me/switch-consents/{id}/approveErgebnis: Ab jetzt darf Lena bis zum Ende in Bens Namen arbeiten, mit seinen Rollen. Beim ersten Wechsel bekommt Ben noch einmal eine Mail.
Ben kann die Freigabe jederzeit widerrufen. Die nächste Anfrage von Lena wird dann schon abgelehnt. Alle Regeln stehen unter Die Freigabe der Zielperson.
Eine Anfrage, Schritt für Schritt
Lenas Werkzeug schickt eine ganz normale Anfrage an CDMS, dazu die beiden Header:
POST /api/rest/order/query
Authorization: Bearer <Token von Lena, Mandant codamic>
tenant: nordbau
user: 3f2a…
{ "response": ["id", "orderNr", "price"] }Die Suche läuft in der Datenbank von nordbau,
mit Lenas Rollen und Bens Benutzer-ID.
Mit zusätzlich "user-roles: target" liefe sie mit Bens Rollen.sequenceDiagram
participant C as Client
participant F as Filterkette
participant G as Mandanten-Tor
participant D as CDMS
participant DB as Datenbank nordbau
C->>F: Token (codamic) + tenant nordbau + user 3f2a…
F->>F: Header lesen, dann Token prüfen
F->>F: auflösen: nordbau ist keine eigene Organisation → codamic
F->>G: Wird codamic bedient?
G-->>F: ja
F->>F: Rollen und Attributwerte für codamic bestimmen
F->>F: Rolle da, nordbau erlaubt → Mandant := nordbau
F->>G: Wird nordbau bedient?
G-->>F: ja
F->>F: Lenas Werte pro Mandant für nordbau neu bestimmen
F->>F: Rolle da, Ben bekannt, Mitglied von nordbau
F->>F: Freigabe von Ben für Lena in nordbau? ja → Person := Ben
F->>D: Anfrage weiterreichen
D->>DB: suchen, mit Lenas Rollen und Bens ID
DB-->>C: Zeilen
Zwei Dinge fallen an dieser Reihenfolge auf, und beide sind Absicht:
- Die Rollen werden vor dem Wechsel bestimmt, für Lenas Ausgangsmandanten, und gelten im Ziel unverändert weiter. Deshalb nimmt niemand durch einen Mandantenwechsel Rechte mit, die im Ziel vergeben sind. Lenas Werte pro Mandant dagegen werden für
nordbauneu bestimmt, denn sie sagen, was sie dort sehen darf. Einzige Ausnahme ist der Benutzerwechsel mituser-roles: target: Dann gelten Bens Rollen und Werte, so wie sie in seinem eigenen Token fürnordbaustünden. - Der Benutzerwechsel kommt zuletzt, nach dem Mandantenwechsel und der zweiten Frage an das Tor. Deshalb muss Ben Mitglied von
nordbausein, nicht voncodamic. - Das Tor wird zweimal gefragt: einmal für den Mandanten aus dem Token, einmal für das Ziel. Ein gesperrter Mandant bleibt auch für den Support gesperrt.
Was Lena sieht und was nicht
- die Zeilen aus der Datenbank von
nordbau - alle Modelle, für die ihre eigenen Rollen reichen
- die Historie eines Objekts, wenn ihre Rollen Lese- und Historienrolle abdecken
- mit Benutzerwechsel: die Zeilen, die in Benutzer-Modellen Ben gehören
- mit
user-roles: target: alles, wofür Bens Rollen und Attributwerte reichen
- ohne
user-roles: target: Rollen, die jemand innordbauhat, sie bekommt keine davon - Felder und Modelle, für die ihre eigenen Rollen nicht reichen
- ohne Benutzerwechsel: fremde Zeilen in Benutzer-Modellen, denn der Owner-Filter arbeitet mit ihrer ID
- die Beschreibung des Mandanten, also Art und Organisation: nach einem privilegierten Wechsel liefert CIAS nur den Schlüssel
Attributwerte sind Werte an einer Person, mit denen CDMS Zeilen aussiebt, etwa regionen. Anders als die Rollen werden Werte pro Mandant nach dem Wechsel für nordbau neu bestimmt; alle übrigen kommen aus Lenas Token. Ein Attributfilter siebt in nordbau also mit Lenas Werten für nordbau, nicht mit Bens, außer mit user-roles: target. Siehe Ein Wert pro Person oder pro Mandant und Attributfilter.
Die Ausprägungen
Wann: Lena schickt tenant: nordbau, keinen Header user.
Sie arbeitet in der Datenbank von nordbau mit ihren eigenen Rollen und ihrer eigenen ID. In Mandanten-Modellen sieht sie die Daten des Kunden; in Benutzer-Modellen sieht sie nichts, weil ihr dort keine Zeile gehört.
Ergebnis: Der richtige Weg, um Daten des Kunden anzusehen.
Wann: Lena schickt tenant: nordbau und user: 3f2a….
Jeder Wechsel braucht seine eigene Realm-Rolle. Zuerst wird der Mandant gewechselt, dann die Person. ID und Name sind danach Bens, der Owner-Filter arbeitet mit Bens ID. Rollen und Attributwerte bleiben Lenas.
Ergebnis: Der Weg, um die eigenen Daten einer Person zu sehen.
Wann: Wie oben, dazu user-roles: target.
Lena bekommt Bens Realm-Rollen, Fachrollen, Gruppen und Attributwerte, vollständig, auch solche, die sie selbst nicht hat. Hat Ben in der Organisation nordbau Rollen, ersetzen diese seine globalen, wie in seinem eigenen Token. Werte pro Mandant holt CIAS für Ben.
Ergebnis: Der Weg, um nachzustellen, was Ben sieht.
Wann: Im Token fehlt allowed-user-context-switch, die ID ist unbekannt, oder Ben gehört nicht zu nordbau.
Der Benutzerwechsel wird nicht still übergangen. Die ganze Anfrage wird abgelehnt, warum genau, steht nur im Log. Kann CIAS gar nicht nachschlagen, wer Ben ist, lautet der Schlüssel user-switch-unavailable.
Ergebnis: 403 cias.authentication.user-switch-denied.
Wann: Rolle da, Ben Mitglied von nordbau, aber keine gültige Freigabe für Lena: nie erteilt, abgelaufen, widerrufen, für einen anderen Mandanten oder nur für eigene Rollen, obwohl user-roles: target mitkommt.
Die Anfrage wird abgelehnt, bevor etwas gewechselt wird. Der Schlüssel ist ein eigener, damit Lenas Werkzeug anbieten kann, Ben um Freigabe zu bitten.
Ergebnis: 403 cias.authentication.user-switch-not-consented.
Wann: Im Token fehlt allowed-tenant-context-switch.
Der Header wird still ignoriert. Es gibt keinen Fehler und keinen Hinweis in der Antwort: Die Anfrage läuft in codamic weiter.
Ergebnis: Lena sieht die Daten ihres eigenen Mandanten und hält sie für die des Kunden.
Wann: nordbau steht nicht in Lenas Liste der erlaubten Mandanten.
CIAS wechselt nicht. Die Persistenz erkennt den abgelehnten Wunsch beim ersten Zugriff auf ein Mandanten-Modell.
Ergebnis: 403 CDMS_TENANT_SWITCH_NOT_AUTHORIZED. Greift die Anfrage nur auf System-Modelle zu, gibt es keinen Fehler.
Wann: Der Wechsel wäre erlaubt, aber nordbau ist gesperrt, geschlossen oder abgelaufen.
Das zweite Tor lehnt ab, ohne Ausnahme für den Support.
Ergebnis: 403 cias.authentication.tenant-not-served. Siehe Ein Kunde kündigt.
Wann: Lena ist Mitglied der Organisation nordbau.
Dann ist der Header keine privilegierte Handlung, sondern eine Auswahl: Sie braucht keine Wechselrolle, und es gelten ihre Rollen in nordbau.
Ergebnis: Anderer Weg, anderes Ergebnis. Siehe Zwischen Mandanten wechseln.
| Header | Realm-Rolle vorhanden | Ziel erlaubt bzw. bekannt | Ergebnis |
|---|---|---|---|
tenant | nein | – | still ignoriert, die Anfrage bleibt im eigenen Mandanten |
tenant | ja | Ziel in der Liste der erlaubten Mandanten | Mandant der Anfrage wird das Ziel, Rollen bleiben die eigenen |
tenant | ja | Ziel nicht in der Liste | kein Wechsel; 403 CDMS_TENANT_SWITCH_NOT_AUTHORIZED beim ersten Zugriff auf Mandanten-Daten |
user | nein | – | 403 cias.authentication.user-switch-denied |
user | ja | Person unbekannt oder nicht Mitglied im Mandanten der Anfrage | 403 cias.authentication.user-switch-denied |
user | ja | Person bekannt und Mitglied, aber keine passende Freigabe | 403 cias.authentication.user-switch-not-consented |
user | ja | Person bekannt, Mitglied und Freigabe passt | ID und Name werden Bens; Rollen Lenas oder mit user-roles: target Bens |
Was ein Wechsel hinterlässt
-
1CIASDer Mandantenwechsel meldet kein Ereignis. Für den Benutzerwechsel stehen Antrag, Freigabe und die erste Nutzung der Freigabe als
SwitchConsentEvent.*im CIAS-Audit, nicht jede einzelne Anfrage -
2CDMSReines Lesen hinterlässt keine Revision. Erst eine Änderung schreibt eine
-
3CDMS→DatenbankÄndert Lena etwas, hält die Revision Benutzer-ID, Benutzername, IP-Adresse und Browser der Anfrage festErgebnis: Nach einem Benutzerwechsel stehen als Benutzer-ID und Name die von Ben in der Revision, dazu Lena als handelnde Person. In der Historie steht ihr Name in
actingUsername.
Mehr dazu unter Was eine Revision festhält und Welche Ereignisse protokolliert werden.
Fallen
Weiter
- Zwischen Mandanten wechseln und die Sicht von CDMS: Mandantenwechsel per Header
- Benutzerwechsel per Header
- Den Mandanten einer Anfrage bestimmen und Den Mandanten zulassen
- Effektive Rollen: global oder im Mandanten
- Der ganze Weg einer Anfrage: Vom Login bis zu den Daten