Worum es geht
Clara berät zwei Kunden: nordbau und suedlogistik. Sie hat ein Konto und ein Passwort. Trotzdem darf keine ihrer Anfragen Daten der beiden Kunden vermischen.
CIAS löst das, indem jede einzelne Anfrage unter genau einem Mandanten läuft. Welcher das ist, entscheidet sich vor jeder Anfrage neu – und daran hängen dann die Rollen und die Attributwerte, die für diese eine Anfrage gelten.
Das Bild
flowchart TB
K["Ein Konto in Keycloak<br/>clara@beispiel.example"]
K --> T["Ein Token:<br/>organization: nordbau, suedlogistik<br/>Rollen je Organisation<br/>Realm-Rollen<br/>Profilattribute"]
T --> R{"Welcher Mandant<br/>für diese Anfrage?"}
R -- "Header tenant: nordbau" --> N["Anfrage in nordbau<br/>Rollen aus nordbau<br/>Werte für nordbau"]
R -- "Header tenant: suedlogistik" --> S["Anfrage in suedlogistik<br/>Rollen aus suedlogistik<br/>Werte für suedlogistik"]
N --> ND[("Datenbank nordbau")]
S --> SD[("Datenbank suedlogistik")]
Wie Clara in zwei Mandanten kommt
Es gibt zwei Formen, und sie verhalten sich unterschiedlich:
| Zwei Organisationen | Ein statischer Mandant, weitere erlaubt | |
|---|---|---|
| Wie sie dazugehört | Mitglied in beiden Organisationen | Attribut tenant nennt ihren Mandanten, allowedTenants weitere Ziele |
| Wo es im Token steht | Claim organization mit beiden Aliassen | Claims tenant und allowedTenants |
| Was sie tun muss, um zu wechseln | Header tenant schicken – keine besondere Rolle nötig | Header tenant und die Realm-Rolle allowed-tenant-context-switch |
| Welche Rollen gelten | die Rollen ihrer Mitgliedschaft im gewählten Mandanten | ihre eigenen Rollen – sie nimmt sie in den Zielmandanten mit |
| Wie sie dazukam | eine Einladung je Mandant, die sie selbst eingelöst hat | ein Administrator hat die Attribute gesetzt |
Der erste Fall heißt Auswahl, der zweite privilegierter Wechsel. Der Unterschied ist nicht kosmetisch: Die Auswahl passiert während der Mandantenauflösung, der Wechsel erst danach. Und die Rollen werden dazwischen bestimmt.
Wie gewählt wird
Die Filterkette liest den Header tenant vor dem Token, weil die gewählte Organisation entscheidet, welche Rollen gelten. Dann prüft sie die Regeln der Reihe nach.
| Organisationen im Token | Header tenant | Realm-Rolle allowed-tenant-context-switch | Ergebnis |
|---|---|---|---|
nordbau, suedlogistik | suedlogistik | – | Auswahl: Anfrage in suedlogistik, mit Claras Rollen dort und den Werten, die CIAS für sie in suedlogistik führt |
nordbau, suedlogistik | fehlt | – | 403 cias.authentication.tenant-unresolved – bei zwei Organisationen ist ohne Auswahl unklar, wessen Daten gemeint sind |
nur nordbau | fehlt | – | Anfrage in nordbau, es gibt nichts zu wählen |
keine, Attribut tenant = nordbau | suedlogistik steht in allowedTenants | vorhanden | privilegierter Wechsel: Anfrage in suedlogistik, aber mit ihren eigenen Rollen aus nordbau |
keine, Attribut tenant = nordbau | suedlogistik | fehlt | still ignoriert: Die Anfrage läuft in nordbau, ohne Fehler und ohne Hinweis |
nordbau, suedlogistik | – | – | Ziel gesperrt, geschlossen oder unbekannt: 403 cias.authentication.tenant-not-served |
Alle Regeln im Einzelnen: Den Mandanten einer Anfrage bestimmen und Zwischen Mandanten wechseln.
Welche Rollen je Mandant gelten
Rollen können an zwei Stellen im Token stehen: global und in einer Organisation. Daraus bildet CIAS bei jeder Anfrage die effektiven Rollen.
In Claras Token:
global (resource_access): report-read
organization nordbau: order-read, order-edit
organization suedlogistik: order-read
realm_access: userEffektiv in nordbau: order-read, order-edit (+ Realm: user)
Effektiv in suedlogistik: order-read (+ Realm: user)report-read fällt in beiden Mandanten weg. Das ist Absicht: Hat Clara in ihrem aktiven, dynamischen Mandanten irgendeine Rolle, ersetzen die Rollen dieses Mandanten die globalen Client-Rollen. Eine global vergebene Rolle hat niemand für diesen einen Kunden vergeben, also gilt sie dort nicht. Realm-Rollen gelten dagegen immer, in jedem Mandanten.
Beim privilegierten Wechsel ist es anders: Dort nimmt Clara ihre eigenen Rollen mit ins Ziel. Rollen, die jemand im Zielmandanten hat, bekommt sie nicht. Einzelheiten: Effektive Rollen: global oder im Mandanten.
Welche Attributwerte je Mandant gelten
Ein Attribut ist eine Angabe an der Person, die als Claim ins Token kommt und mit der CDMS Zeilen filtert. Bei der Anmeldung sagt jedes Modul, worüber das Attribut etwas aussagt:
| Bindung | Bedeutung | Wo der Wert liegt |
|---|---|---|
USER | ein Wert pro Person, in jedem Mandanten derselbe | am Konto in Keycloak, kommt über das Token |
USER_IN_TENANT | ein Wert je Person und Mandant | in CIAS, je Person und Mandant |
Für ein Attribut mit USER_IN_TENANT fragt CIAS bei jeder Anfrage die Werte ab, die es für Clara im aktiven Mandanten führt.
-
1CIASliest die Attribute aus dem Token, so wie sie am Konto stehen
-
2CIASholt die Werte, die es für diese Person in diesem Mandanten führt
-
3CIASfür jeden Schlüssel, zu dem es Werte führt, ersetzen diese den Wert aus dem Token. Gemischt wird nie
-
4CIASführt CIAS zu einem Schlüssel in diesem Mandanten keine Werte, bleibt der Wert aus dem Token stehen
-
5CDMSfiltert die Zeilen mit dem, was am Ende im RequestContext stehtErgebnis: Dieselbe Person, dasselbe Token, je Mandant andere Zeilen
Am Konto (Token): region = nord, sued
In CIAS, nordbau: region = nord
In CIAS, suedlogistik: region = suedEffektiv in nordbau: region = nord
Effektiv in suedlogistik: region = suedKann CIAS die Werte nicht abrufen und hat auch keinen Pufferwert, lehnt es die Anfrage ab, statt auf den Wert aus dem Token zurückzufallen: 403 cias.authentication.tenant-not-served. Die Antworten merkt sich CIAS je Person und Mandant 30 Sekunden.
Was sich nicht je Mandant unterscheidet
| Was | Warum |
|---|---|
| Konto und Passwort | Die Adresse ist das Konto. Es gibt genau eins |
| Realm-Rollen | Sie gelten für die ganze Plattform. Keine Organisation kann ihnen etwas hinzufügen |
| Gruppen | Die Gruppenmitgliedschaft hängt am Konto, nicht am Mandanten |
Profilattribute (USER) | ein Wert pro Person, in jedem Mandanten derselbe |
| Heimatmandant im Benutzerdatensatz | CIAS führt einen Heimatmandanten je Person. Weitere Mitgliedschaften stehen in Keycloak und kommen über das Token |
Sprache (locale) | eine Vorliebe der Person |
Der Heimatmandant im Benutzerdatensatz von CIAS ist deshalb keine Aussage darüber, in welchem Mandanten eine Anfrage läuft. Das entscheidet immer das Token. Siehe Der Benutzerdatensatz.
Der Weg einer Anfrage, verkürzt
-
CIASHeader lesenDer Header wird vor dem Token gelesen, weil er die Rollen mitbestimmt
-
CIASAuflösenIst
suedlogistikeine ihrer eigenen Organisationen? Dann ist es der Mandant der Anfrage↳ nein 403cias.authentication.tenant-unresolved -
CIASMandanten-TorWird
suedlogistikbedient, alsoACTIVEund im Gültigkeitsfenster?↳ nein 403cias.authentication.tenant-not-served -
CIASRollen und AttributeRollen aus der Organisation
suedlogistik, Attributwerte fürsuedlogistik -
CDMSRechteprüfungErlaubt eine effektive Rolle dieses Modell?↳ nein 403
-
CDMSDatenbankIn MULTI die Datenbank von
suedlogistik - Zeilen aus suedlogistik, gefiltert mit Claras Werten für suedlogistik
Den vollständigen Weg beschreibt Vom Login bis zu den Daten.