CodamAIDocs
Themafertig

Mandant, Organisation, Gruppe

Zwei Strukturbegriffe, nicht drei. Der Mandant trennt Daten, die Gruppe bündelt Rollen, „Organisation“ ist nur Keycloaks Name für einen dynamischen Mandanten. Mit der einen Frage, die entscheidet, und einem durchgespielten Szenario.

Ausprägungen
MandantOrganisation (nur Keycloak)GruppeEltern-/Kind-Struktur (bewusst nicht)

Worum es geht

Drei Wörter tauchen immer wieder auf, wenn es um die Struktur von Kunden geht: Mandant, Organisation und Gruppe. Sie klingen nach drei Dingen. In CIAS sind es aber nur zwei:

  • Der Mandant trennt Daten. Was in Mandant A liegt, sieht niemand aus Mandant B.
  • Die Gruppe bündelt Rollen. Wer Mitglied ist, bekommt alle Rollen der Gruppe.
  • Die Organisation ist kein eigenes Ding. Sie ist Keycloaks Name für einen dynamischen Mandanten.

Die eine Frage, die entscheidet

Wenn jemand „wir brauchen eine Organisation für X“ sagt, hilft eine einzige Frage:

flowchart TB
    Q{"Sollen diese Personen die Daten<br/>der anderen nicht sehen können?"}
    Q -- "ja" --> T["Eigener Mandant<br/>Daten getrennt"]
    Q -- "nein" --> Q2{"Sollen sie gemeinsam<br/>dieselben Rollen bekommen?"}
    Q2 -- "ja" --> G["Gruppe<br/>ein Bündel Rollen"]
    Q2 -- "nein" --> N["einzelne<br/>Rollenvergaben"]

Nur die Antwort „ja“ auf die erste Frage kostet einen Mandanten. Ein Mandant ist schwer: Er bekommt eigene Daten, oft eine eigene Datenbank, und jede Anfrage läuft unter genau einem Mandanten. Eine Gruppe ist leicht: Sie ist nur eine Liste von Rollen und Mitgliedern.

Die drei Begriffe nebeneinander

Was jeder Begriff in CIAS bedeutet
MandantOrganisationGruppe
Aufgabetrennt Datenkeine eigenebündelt Rollen
Wer führt ihn?CIASniemand, sie folgt dem MandantenCIAS
Datensatz in CIASja, mit Schlüssel, Art, Statusnein, nur die ID als Verweis am Mandantenja, mit Rollen und Mitgliedern
In Keycloakdynamisch: Organisation. Statisch: nichtsOrganisationGruppe im Realm
Wirkt im Token alsaktiver Mandant der AnfrageOrganisations-Claim mit Mitgliedschaft und Rollendie Rollen, die sie enthält
Eltern und Kinderneinneinnein

Der Mandant

Ein Mandant ist eine Kundeneinheit mit eigenen, abgetrennten Daten. CIAS führt ihn als eigenen Datensatz und ist das einzige System, das Mandanten anlegt. Es gibt zwei Arten:

ArtWie Keycloak ihn kenntWie eine Person ihm zugeordnet wird
DYNAMICals OrganisationMitgliedschaft in der Organisation
STATICgar nichtüber das Attribut tenant (und allowedTenants) am Konto

Die Art steht am Mandanten, nicht an der Installation. Mehr unter Statische und dynamische Mandanten.

Die Organisation

Keycloak hat eine eigene Funktion „Organizations“. CIAS nutzt sie, um einen dynamischen Mandanten in Keycloak abzubilden. Das heißt:

  • Eine Organisation entsteht, wenn eine Firma sich selbst registriert: CIAS legt dann die Organisation und den dynamischen Mandanten zusammen an. Wird ein dynamischer Mandant über die Verwaltungs-API angelegt, nennt der Aufruf eine Organisation, die es schon gibt. Einen eigenen Lebenslauf hat sie nicht, sie folgt dem Mandanten.
  • Es gibt in CIAS keine Organisationsverwaltung, keine eigene Tabelle und keinen eigenen Endpunkt für Organisationen.
  • In CIAS-Oberflächen und -APIs heißt es immer Mandant. Das Wort „Organisation“ begegnet dir nur in der Keycloak-Konsole, im Adapter und im Token, dort als Claim organization.

Die Gruppe

Eine Gruppe ist ein Bündel von Rollen. Statt jeder neuen Kollegin im Support zehn Rollen einzeln zu geben, legst du einmal die Gruppe support an und machst die Kollegin zum Mitglied.

  • Eine Gruppe darf Rollen mehrerer Module zugleich tragen, etwa CDMS- und CRMS-Rollen.
  • Eine Gruppe gilt plattformweit. Sie ist keinem Mandanten zugeordnet.
  • Eine Gruppe kann Standardgruppe sein: Jedes neue Konto tritt ihr bei.
  • Mitglied sein heißt: Du bekommst die Rollen. Es heißt nicht, dass du die Daten anderer Mitglieder siehst.

Mehr unter Was eine Gruppe ist. Wie Client-Rollen aus einer Gruppe unter einem dynamischen Mandanten wirken, steht unter Gruppenrollen unter dynamischen Mandanten.

Keine Eltern und Kinder

Ein Mandant hat keinen übergeordneten Mandanten, und eine Organisation hat keine Unter-Organisation. Das ist Absicht. Ein Mandant ist eine Trennlinie. Hätte er Kinder, müsste für jede dieser drei Fragen eine Antwort feststehen:

  1. Wenn der Eltern-Mandant gesperrt ist, sind dann auch die Kinder gesperrt?
  2. Gelten die Rollen aus dem Eltern-Mandanten auch in den Kindern?
  3. Sieht der Eltern-Mandant die Daten der Kinder?

Jede Antwort wäre eine Sicherheitsentscheidung. Deshalb gibt es keine Mandanten-Hierarchie. Jeder Mandant steht für sich.

Kunde will „Holding mit Töchtern“
Sollen die Töchter die Daten der anderen sehen?Gemeinsame Rollen?Lösung in CIAS
nein–je Tochter ein eigener Mandant
jajaein Mandant, dazu Gruppen für die gemeinsamen Rollenbündel
janeinein Mandant, Rollen einzeln vergeben

Szenario: zwei Firmen, eine Anwendung

Zwei Kunden nutzen dieselbe Anwendung: die Nordbau GmbH und die Südlogistik AG. Beide dürfen die Daten der anderen nicht sehen.

Wie die Struktur entsteht
  1. 1
    Admin→Keycloak
    legt die Organisationen nordbau und suedlogistik an und macht Anna bzw. Ben zu Mitgliedern
  2. 2
    Admin→CIAS
    legt den Mandanten nordbau an, Art DYNAMIC, mit der ID der Organisation nordbau
  3. 3
    Admin→CIAS
    legt den Mandanten suedlogistik an, Art DYNAMIC, mit der ID der Organisation suedlogistik
  4. 4
    Admin→CIAS
    legt die Gruppe sachbearbeitung an, mit den Rollen customer-read und order-edit
  5. 5
    CIAS→Keycloak
    legt die Gruppe im Realm an, markiert mit cias-managed=true
  6. 6
    Admin→CIAS
    macht Anna (Nordbau) und Ben (Südlogistik) zu Mitgliedern der Gruppe
    Ergebnis: Beide haben dieselben Rollen, jeder aber nur in den Daten des eigenen Mandanten

Was jetzt gilt:

AnnaBen
Mandantnordbausuedlogistik
Rollen aus der Gruppecustomer-read, order-editcustomer-read, order-edit
sieht Kunden von Nordbaujanein
sieht Kunden von Südlogistikneinja

Die Gruppe hat Anna und Ben dieselben Rechte gegeben. Der Mandant sorgt dafür, dass sie diese Rechte auf verschiedenen Daten ausüben. Die gemeinsame Gruppe verbindet die beiden nicht.

Quellen im Code und in der Wissensdatenbank
  • CIAS/CLAUDE.md – §9 Tenant- und Organisationsmodell, §10 Tenant-Typen
  • CIAS/cias-tenancy/docs/adr – ADR-006, ADR-020, ADR-037
  • CIAS/cias-authorization/docs/adr – ADR-034
  • CIAS/cias-tenancy – V1__cias_tenant.sql (kein Eltern-Feld)
  • CIAS/cias-authorization – V4__cias_group.sql, V5__cias_group_default.sql
  • CIAS/cias-iam-keycloak – KeycloakOrganizationAdapter, KeycloakRoleAdapter
Suchen