CodamAIDocs
Themafertig

In SINGLE zählt der Mandant im Token nicht

In der Betriebsart SINGLE wird der Mandant im Token ignoriert: kein Tor, kein Wechsel. Warum das so ist und warum ein Schalter hier zwei Bedeutungen trägt.

Ausprägungen
SINGLEMULTI

Worum es geht

Die Betriebsart einer Installation steht in codamai.persistence.tenant.mode (Umgebungsvariable CODAMAI_PERSISTENCE_TENANT_MODE). Es gibt zwei Werte:

  • MULTI: Jeder Mandant hat eine eigene Datenbank. Die Installation hat mehrere Kunden.
  • SINGLE: Es gibt eine einzige Datenbank. Die Installation hat keine Mandanten, meist nur einen Kunden, oft den Betreiber selbst.

Keycloak ist dabei oft für mehrere Installationen derselbe. Seine Tokens tragen Organisationen und Attribute tenant, die für die anderen Installationen gedacht sind. Eine Installation in SINGLE würde diese Mandanten nie anlegen. Würde sie sie trotzdem prüfen, lehnte das Tor jede Anfrage ab: „Mandant unbekannt“.

SINGLE und MULTI nebeneinander

Was CIAS mit dem Mandanten im Token macht
MULTISINGLE
Auflösungläuft, nach den sechs Regelnläuft nicht, Ergebnis immer „ohne Mandant“
Mehrere Organisationen ohne Auswahl403 tenant-unresolvedkein Fehler
Mandanten-Torfragt für jeden Mandantenfragt nie
Mandant im RequestContextder aufgelöste Schlüsselleer
Liste der erlaubten Mandanteneigener Mandant, Organisationen, allowedTenantsleer
Header tenantAuswahl oder privilegierter Wechselbewirkt nichts, auch mit Rolle
Token ohne Mandant403 tenant-required, außer /cias/**zugelassen
Rollen aus einer Organisationgelten im gewählten Mandantengelten nicht
Mandanten anlegenDatenbank wird eingerichtetnichts einzurichten, sofort ACTIVE
Arbeit ohne Anfrage mit genanntem Mandantenfragt das Torfragt das Tor trotzdem

Die Liste der erlaubten Mandanten bleibt in SINGLE absichtlich leer. Ein Wechsel ist nur in einen Mandanten dieser Liste möglich. So kommt der eben übergangene Mandant nicht auf einem Umweg über den Header tenant zurück.

Was ohne Organisation mit den Rollen passiert

In MULTI können Rollen an einer Organisation hängen: Eine Person hat sie nur, solange sie in dieser Organisation arbeitet. In SINGLE gibt es keinen Mandanten, also auch keine Organisation, in der die Person gerade arbeitet.

Welche Rollen in SINGLE gelten

Wann: realm_access.roles im Token

Gelten wie in MULTI.

Ergebnis: unverändert

Wann: resource_access.<client>.roles im Token

Gelten. Sie hängen an keiner Organisation.

Ergebnis: Das sind die Rollen, mit denen eine Installation in SINGLE arbeitet.

Wann: Rollen, die das Token nur über eine Mitgliedschaft in einer Organisation vergibt

Gelten nicht. Sie gehören zu einem Mandanten, den diese Installation nicht hat.

Ergebnis: Braucht eine SINGLE-Installation diese Rollen, müssen sie in Keycloak als globale Client-Rollen vergeben werden.

Warum ein Schalter hier zwei Bedeutungen trägt

codamai.persistence.tenant.mode beschreibt eigentlich die Datenhaltung: eine Datenbank oder viele. CIAS liest denselben Schalter, um zu entscheiden, wie es Tokens auswertet. Das ist gewollt: Ob eine Installation Mandanten hat, ist eine Aussage über die ganze Installation, und eine zweite Einstellung könnte der ersten widersprechen. Die Folge musst du aber kennen:

Wer den Schalter liestWas er daraus macht
Persistenz (CDMS)SINGLE: alles in die eine Datenbank, keine Prüfung der erlaubten Mandanten. MULTI: eine Datenbank je Mandant
Einrichtung neuer MandantenSINGLE: nichts einzurichten. MULTI: Datenbank anlegen und migrieren
Filterkette (CIAS)SINGLE: Mandanten im Token übergehen. MULTI: auflösen, zulassen, ohne Mandant ablehnen

Wer also eine Installation auf SINGLE stellt, weil sie nur eine Datenbank hat, schaltet damit auch die Mandantenprüfung von CIAS ab.

Fehlt der Schalter ganz, ist das nicht SINGLE. Eine solche Installation hat keine CDMS-Persistenz, zum Beispiel ein CIAS ganz ohne Datenhaltung für Mandanten. Sie wertet Mandanten im Token aus und fragt das Tor, verlangt aber nicht, dass jede Anfrage einen Mandanten hat. Wo es die CDMS-Persistenz gibt, muss der Schalter gesetzt sein, sonst startet die Anwendung nicht.

Fallen

Weiter

Quellen im Code und in der Wissensdatenbank
  • CIAS/cias-kernel – TenantRequirement (required, ignoresTenants, codamai.persistence.tenant.mode)
  • CIAS/cias-authentication – TokenParser.admit (tenantless → TenantResolution.none, allowedTenants leer), TenantGate.admit (ohne Mandant zugelassen), JwtSessionFilter.tenantMissing, EffectiveRoles
  • CIAS/cias-authentication – TenantScope (unverändert)
  • commons-persistence – NoOpTenantProvisioningAdapter, DatabaseRequestContext.resolveTenant
  • CIAS/cias-authentication/docs/adr – ADR-035; CIAS/cias-tenancy/docs/adr – ADR-045
Suchen