CodamAIDocs
Themafertig

Eine Person in zwei Mandanten

Eine Beraterin arbeitet für zwei Kunden. Wie sie zwischen den Mandanten wählt, welche Rollen jeweils gelten und welche Attributwerte für sie gelten.

Ausprägungen
zwei Organisationen (Auswahl)statischer Mandant mit allowedTenants (privilegierter Wechsel)Rollen je MandantAttributwerte je Mandantkeine Auswahl geschickt

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 Wege zu zwei Mandanten
Zwei OrganisationenEin statischer Mandant, weitere erlaubt
Wie sie dazugehörtMitglied in beiden OrganisationenAttribut tenant nennt ihren Mandanten, allowedTenants weitere Ziele
Wo es im Token stehtClaim organization mit beiden AliassenClaims tenant und allowedTenants
Was sie tun muss, um zu wechselnHeader tenant schicken – keine besondere Rolle nötigHeader tenant und die Realm-Rolle allowed-tenant-context-switch
Welche Rollen geltendie Rollen ihrer Mitgliedschaft im gewählten Mandantenihre eigenen Rollen – sie nimmt sie in den Zielmandanten mit
Wie sie dazukameine Einladung je Mandant, die sie selbst eingelöst hatein 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.

Welcher Mandant, welche Rollen, welche Attributwerte?
Organisationen im TokenHeader tenantRealm-Rolle allowed-tenant-context-switchErgebnis
nordbau, suedlogistiksuedlogistik–Auswahl: Anfrage in suedlogistik, mit Claras Rollen dort und den Werten, die CIAS für sie in suedlogistik führt
nordbau, suedlogistikfehlt–403 cias.authentication.tenant-unresolved – bei zwei Organisationen ist ohne Auswahl unklar, wessen Daten gemeint sind
nur nordbaufehlt–Anfrage in nordbau, es gibt nichts zu wählen
keine, Attribut tenant = nordbausuedlogistik steht in allowedTenantsvorhandenprivilegierter Wechsel: Anfrage in suedlogistik, aber mit ihren eigenen Rollen aus nordbau
keine, Attribut tenant = nordbausuedlogistikfehltstill 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.

Token
In Claras Token:

global (resource_access):      report-read
organization nordbau:          order-read, order-edit
organization suedlogistik:     order-read
realm_access:                  user
Effektive Rollen
Effektiv 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:

BindungBedeutungWo der Wert liegt
USERein Wert pro Person, in jedem Mandanten derselbeam Konto in Keycloak, kommt über das Token
USER_IN_TENANTein Wert je Person und Mandantin 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.

Wie der effektive Wert entsteht
  1. 1
    CIAS
    liest die Attribute aus dem Token, so wie sie am Konto stehen
  2. 2
    CIAS
    holt die Werte, die es für diese Person in diesem Mandanten führt
  3. 3
    CIAS
    für jeden Schlüssel, zu dem es Werte führt, ersetzen diese den Wert aus dem Token. Gemischt wird nie
  4. 4
    CIAS
    führt CIAS zu einem Schlüssel in diesem Mandanten keine Werte, bleibt der Wert aus dem Token stehen
  5. 5
    CDMS
    filtert die Zeilen mit dem, was am Ende im RequestContext steht
    Ergebnis: Dieselbe Person, dasselbe Token, je Mandant andere Zeilen
Werte
Am Konto (Token):   region = nord, sued
In CIAS, nordbau:      region = nord
In CIAS, suedlogistik: region = sued
Wirkung im Filter
Effektiv in nordbau:      region = nord
Effektiv in suedlogistik: region = sued

Kann 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

WasWarum
Konto und PasswortDie Adresse ist das Konto. Es gibt genau eins
Realm-RollenSie gelten für die ganze Plattform. Keine Organisation kann ihnen etwas hinzufügen
GruppenDie Gruppenmitgliedschaft hängt am Konto, nicht am Mandanten
Profilattribute (USER)ein Wert pro Person, in jedem Mandanten derselbe
Heimatmandant im BenutzerdatensatzCIAS 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

Claras Anfrage mit Header tenant = suedlogistik
  1. CIAS
    Header lesen
    Der Header wird vor dem Token gelesen, weil er die Rollen mitbestimmt
  2. CIAS
    Auflösen
    Ist suedlogistik eine ihrer eigenen Organisationen? Dann ist es der Mandant der Anfrage
    ↳ nein 403 cias.authentication.tenant-unresolved
  3. CIAS
    Mandanten-Tor
    Wird suedlogistik bedient, also ACTIVE und im Gültigkeitsfenster?
    ↳ nein 403 cias.authentication.tenant-not-served
  4. CIAS
    Rollen und Attribute
    Rollen aus der Organisation suedlogistik, Attributwerte für suedlogistik
  5. CDMS
    Rechteprüfung
    Erlaubt eine effektive Rolle dieses Modell?
    ↳ nein 403
  6. CDMS
    Datenbank
    In MULTI die Datenbank von suedlogistik
  7. Zeilen aus suedlogistik, gefiltert mit Claras Werten für suedlogistik

Den vollständigen Weg beschreibt Vom Login bis zu den Daten.

Fallen

Weiter

Quellen im Code und in der Wissensdatenbank
  • CIAS/cias-authentication – OrganizationTenantResolver, TenantResolution, TokenParser.admit (Reihenfolge: Auflösung, Tor, Rollen, Attribute, Kontext, Wechsel, zweites Tor), buildAllowedTenants, ContextSwitch, TenantGate
  • CIAS/cias-authentication – EffectiveRoles.resolve, EffectiveAttributes.resolve, AttributeLookup, KeycloakOrganizationClaimReader
  • CIAS/cias-user – TenantBoundAttributeService, TenantBoundAttributeReader (cias_user_attribute.tenant_key), UserService.record (homeTenantKey)
  • CIAS/cias-registration – RegistrationService.assignTenant, writeTenantAttributes
  • commons – models.AttributeBinding (USER, USER_IN_TENANT)
  • CIAS/cias-authentication/docs/adr – ADR-006, ADR-021, ADR-042; CIAS/cias-authorization/docs/adr – ADR-023
Suchen