CodamAIDocs
Themafertig

Der Support schaut in einen Mandanten

Ein Plattform-Mitarbeiter wechselt mit Rolle und Header in einen Kundenmandanten, um ein Problem nachzuvollziehen. Was er sieht und was nicht.

Ausprägungen
nur MandantenwechselMandanten- und Benutzerwechsel, eigene RollenMandanten- und Benutzerwechsel, Bens RollenMandanten-Rolle fehlt → still ignoriertBenutzer-Rolle fehlt oder Ben nicht in nordbau → 403Ben hat nichts freigegeben → 403Freigabe beantragen und bestätigenZiel nicht erlaubtZiel gesperrtSupport ist selbst Mitglied (Auswahl)

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-Header user-roles: target auch 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

WasWoWarum
Realm-Rolle allowed-tenant-context-switchdirekt in Keycloak am Konto von Lenaerlaubt überhaupt einen Wechsel in einen fremden Mandanten
nordbau im Attribut allowedTenantsam Konto von Lenasagt, welche Mandanten sie erreichen darf
Realm-Rolle allowed-user-context-switchdirekt in Keycloaknur nötig, wenn Lena auch die Person wechseln soll
Bens Freigabe für Lena in nordbauBen bestätigt Lenas Antrag oder erteilt sie selbst, siehe untenohne sie endet jeder Benutzerwechsel zu Ben mit 403 user-switch-not-consented
Ben ist Mitglied von nordbauOrganisation nordbau, oder Bens Attribut tenant bzw. allowedTenantsin eine Person außerhalb des Ziel-Mandanten wird nicht gewechselt
Nachfrage nach der Zielpersonnur wenn CDMS und CIAS getrennt laufen, siehe Benutzerwechsel per Headerohne sie endet jeder Benutzerwechsel mit 403
Fachrollen für die Modelle, in die sie schauen willim Rollenkatalog, an Lena vergebenohne 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.

Lena bittet um Freigabe
  1. 1
    Client→CIAS
    Lena schickt POST /cias/me/switch-requests mit target: 3f2a…, mode: target, validUntil (etwa in zwei Tagen) und reason: Ticket 4711. Ihr Token läuft dafür im Mandanten nordbau.
  2. 2
    CIAS
    legt den Antrag an und schickt Ben eine Mail: wer fragt, mit wessen Rechten, bis wann und warum
  3. 3
    Client→CIAS
    Ben bestätigt in seinem Portal: POST /cias/me/switch-consents/{id}/approve
    Ergebnis: 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:

Anfrage
POST /api/rest/order/query
Authorization: Bearer <Token von Lena, Mandant codamic>
tenant: nordbau
user: 3f2a…
{ "response": ["id", "orderNr", "price"] }
Antwort
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 nordbau neu bestimmt, denn sie sagen, was sie dort sehen darf. Einzige Ausnahme ist der Benutzerwechsel mit user-roles: target: Dann gelten Bens Rollen und Werte, so wie sie in seinem eigenen Token für nordbau stünden.
  • Der Benutzerwechsel kommt zuletzt, nach dem Mandantenwechsel und der zweiten Frage an das Tor. Deshalb muss Ben Mitglied von nordbau sein, nicht von codamic.
  • 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

Nach dem Wechsel nach nordbau
Sieht sie
kommt aus dem Ziel
  • 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
Sieht sie nicht
bleibt ihres oder fehlt
  • ohne user-roles: target: Rollen, die jemand in nordbau hat, 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

Was in welcher Lage passiert

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.

Wann wirkt welcher Header?
HeaderRealm-Rolle vorhandenZiel erlaubt bzw. bekanntErgebnis
tenantnein–still ignoriert, die Anfrage bleibt im eigenen Mandanten
tenantjaZiel in der Liste der erlaubten MandantenMandant der Anfrage wird das Ziel, Rollen bleiben die eigenen
tenantjaZiel nicht in der Listekein Wechsel; 403 CDMS_TENANT_SWITCH_NOT_AUTHORIZED beim ersten Zugriff auf Mandanten-Daten
usernein–403 cias.authentication.user-switch-denied
userjaPerson unbekannt oder nicht Mitglied im Mandanten der Anfrage403 cias.authentication.user-switch-denied
userjaPerson bekannt und Mitglied, aber keine passende Freigabe403 cias.authentication.user-switch-not-consented
userjaPerson bekannt, Mitglied und Freigabe passtID und Name werden Bens; Rollen Lenas oder mit user-roles: target Bens

Was ein Wechsel hinterlässt

Spuren einer Support-Sitzung
  1. 1
    CIAS
    Der 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
  2. 2
    CDMS
    Reines Lesen hinterlässt keine Revision. Erst eine Änderung schreibt eine
  3. 3
    CDMS→Datenbank
    Ändert Lena etwas, hält die Revision Benutzer-ID, Benutzername, IP-Adresse und Browser der Anfrage fest
    Ergebnis: 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

Quellen im Code und in der Wissensdatenbank
  • CIAS/cias-authentication – JwtSessionFilter (Header `tenant` und `user` vor dem Token), TokenParser.admit (Reihenfolge: Auflösung, Tor, Rollen, Attribute, Wechsel, zweites Tor), TokenParser.switchUser (allowed-user-context-switch, Header user-roles, Mitgliedschaft im Ziel-Mandanten), SwitchTargetLookup, RequestAdmission (USER_SWITCH_DENIED, USER_SWITCH_UNAVAILABLE, USER_SWITCH_NOT_CONSENTED), UserSwitchPolicy, ContextSwitch (allowed-tenant-context-switch, isAllowedTarget), EffectiveRoles.resolve, EffectiveAttributes.resolve, ResolvedTenantHolder
  • CIAS/cias-authentication – TenantGate (Merkzeit 30 s), RequestAdmission.TENANT_NOT_SERVED
  • CIAS/cias-authorization – ConferralCeiling.resolve (Person aus dem Subject des Aufrufers); CIAS/cias-audit – DomainEventAuditListener (Handelnder aus dem CallerContext); CIAS/cias-spring-boot-starter – RequestContextCallerContextProvider
  • commons-persistence – DatabaseRequestContext.requireAllowedTenant, PersistenceErrorCode.CDMS_TENANT_SWITCH_NOT_AUTHORIZED
  • CDMS/cdms-system-layer – AbstractLayer (Owner-Filter über getUserId); CDMS/cdms-authorization – AbstractAttributeFilter; CDMS/cdms-persistence-database – AuditRevisionListener (userId, username, acting_user_id, acting_username)
  • CIAS/cias-user – SwitchConsentService, SwitchConsentController (/cias/me/switch-requests, /cias/me/switch-consents); CIAS/cias-notification – SWITCH_CONSENT_REQUESTED, SWITCH_CONSENT_USED
  • CIAS/cias-authentication/docs/adr – ADR-006, ADR-021, ADR-042; CIAS/cias-user/docs/adr – ADR-050
Suchen