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
| MULTI | SINGLE | |
|---|---|---|
| Auflösung | läuft, nach den sechs Regeln | läuft nicht, Ergebnis immer „ohne Mandant“ |
| Mehrere Organisationen ohne Auswahl | 403 tenant-unresolved | kein Fehler |
| Mandanten-Tor | fragt für jeden Mandanten | fragt nie |
| Mandant im RequestContext | der aufgelöste Schlüssel | leer |
| Liste der erlaubten Mandanten | eigener Mandant, Organisationen, allowedTenants | leer |
| Header tenant | Auswahl oder privilegierter Wechsel | bewirkt nichts, auch mit Rolle |
| Token ohne Mandant | 403 tenant-required, außer /cias/** | zugelassen |
| Rollen aus einer Organisation | gelten im gewählten Mandanten | gelten nicht |
| Mandanten anlegen | Datenbank wird eingerichtet | nichts einzurichten, sofort ACTIVE |
| Arbeit ohne Anfrage mit genanntem Mandanten | fragt das Tor | fragt 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.
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 liest | Was er daraus macht |
|---|---|
| Persistenz (CDMS) | SINGLE: alles in die eine Datenbank, keine Prüfung der erlaubten Mandanten. MULTI: eine Datenbank je Mandant |
| Einrichtung neuer Mandanten | SINGLE: 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
- Die Sicht von CDMS: SINGLE und MULTI
- Beide Module zusammen: SINGLE und MULTI über beide Module
- Den Mandanten zulassen (Mandanten-Tor)