Worum es geht
Eine Installation hat entweder Mandanten oder sie hat keine. Welches von beidem gilt, steht in einer Einstellung:
codamai.persistence.tenant.mode = SINGLE | MULTI
als Umgebungsvariable CODAMAI_PERSISTENCE_TENANT_MODE. Ein Mandant ist dabei ein Kunde, dessen Daten von den Daten anderer Kunden getrennt bleiben müssen.
Warum nicht zwei getrennte Einstellungen? Weil zwei Einstellungen sich widersprechen könnten. Ein Widerspruch sähe dann aus wie „manche Anfragen werden abgelehnt und manche nicht“ und nicht wie der Konfigurationsfehler, der er ist.
Ein Schalter, mehrere Leser
flowchart TB
S{{"codamai.persistence.tenant.mode"}}
S --> P["Datenbankzugriff (CDMS)<br/>welche Datenbank eine Anfrage trifft"]
S --> F["Dateiablage (CDMS)<br/>ein Verzeichnis je Mandant oder nicht"]
S --> V["Einrichtung (commons-persistence)<br/>Datenbank anlegen oder nichts tun"]
S --> K["Filterkette (CIAS)<br/>Mandant auflösen, Tor fragen, ohne Mandant ablehnen"]
S --> M["/cias/me (CIAS)<br/>meldet, ob ein Mandant verlangt wird"]
Beachte, dass die Betriebsart nichts darüber sagt, ob ein einzelner Mandant gerade bedient werden darf. Das ist die Antwort des Mandanten-Tors und wird bei jeder Anfrage neu geholt.
Die Matrix
| SINGLE | MULTI | |
|---|---|---|
| CDMS: Datenbanken | eine, sie heißt single | eine System-Datenbank plus eine je Mandant |
| CDMS: wohin Mandanten- und Benutzer-Modelle gehen | in dieselbe Datenbank wie die System-Modelle | in die Datenbank des Mandanten der Anfrage |
| CDMS: Dateiablage | ein Verzeichnisbaum, ohne Mandanten-Ebene | ein Verzeichnis je Mandant |
| CDMS: neuer Mandant | nichts einzurichten, der Mandant ist sofort aktiv | Datenbank anlegen und migrieren |
| CIAS: Mandant im Token | wird übergangen, weder geprüft noch abgelehnt | wird aufgelöst, aus Organisation oder Attribut |
| CIAS: Mandanten-Tor | wird nie gefragt | wird für jeden aufgelösten Mandanten gefragt |
| CIAS: Anfrage ohne Mandanten | zugelassen | 403 tenant-required, außer auf /cias/** |
| CIAS: Liste der erlaubten Mandanten | bleibt leer | eigener Mandant plus Organisationen |
CIAS: Header tenant | bewirkt nichts, auch mit Rolle | erlaubt den Wechsel in einen Mandanten dieser Liste |
| CIAS: Rollen aus einer Organisation | gelten nicht | gelten im gewählten Mandanten |
| CIAS: Mandanten führen | möglich, wirkt sich aber auf keine Anfrage aus | möglich und nötig |
Die Einzelheiten stehen auf den beiden Modulseiten, und dort gehören sie auch hin:
- Die Sicht von CDMS auf die Datenhaltung: SINGLE und MULTI
- Die Sicht von CIAS auf das Token: In SINGLE zählt der Mandant im Token nicht
- Was die Filterkette mit dem Token macht: Was bei jeder Anfrage mit dem Token passiert
Derselbe Schalter prüft den Mandanten im Token
Das ist der Teil, der überrascht. Die Einstellung heißt nach der Persistenz (codamai.persistence.tenant.mode), aber CIAS liest sie mit, obwohl CIAS gar keine Abhängigkeit auf die Persistenz von CDMS hat. Es liest sie als reinen Text und vergleicht ihn mit zwei Wörtern.
Daraus macht CIAS zwei verschiedene Fragen:
| Was CIAS fragt | Antwort bei MULTI | Antwort bei SINGLE | Antwort, wenn nichts gesetzt ist |
|---|---|---|---|
| Muss eine angemeldete Anfrage einen Mandanten nennen? | ja | nein | nein |
| Soll der Mandant im Token übergangen werden? | nein | ja | nein |
Die dritte Spalte ist kein Tippfehler. Nicht gesetzt ist nicht dasselbe wie SINGLE. Eine Installation ohne diese Einstellung ist eine, die gar keine CDMS-Persistenz mitbringt — ein CIAS, das Identitäten für die Ablage von jemand anderem verwaltet. Sie wertet Mandanten im Token ganz normal aus und fragt das Tor, verlangt aber nicht, dass jede Anfrage einen Mandanten hat. Es gibt ja keine Datenbankwahl, die ein fehlender Mandant verletzen könnte.
Wo die Persistenz von CDMS dabei ist, kann die Einstellung nicht fehlen: sie ist dort als Pflichtangabe deklariert, und ohne sie startet die Anwendung nicht.
Der eigenständige CIAS-Dienst setzt die Einstellung selbst, und zwar auf SINGLE, solange die Installation nichts anderes sagt (CDMS_TENANT_MODE). Der Grund: Meist verwaltet eine Installation mit einem Keycloak über alle ihre Mandanten hinweg. MULTI ist für den Betreiber, der mehrere Instanzen betreibt und jede an ihren Mandanten binden will.
| Wert | CDMS-Persistenz im Prozess? | Was passiert |
|---|---|---|
MULTI | ja | Trennung nach Mandanten, Mandant im Token ist Pflicht |
SINGLE | ja | eine Datenbank, Mandant im Token wird übergangen |
| nicht gesetzt | ja | Start scheitert, die Meldung nennt die Einstellung |
| nicht gesetzt | nein | Mandanten werden ausgewertet, aber nicht verlangt |
Betriebsart und Bauform sind zwei verschiedene Dinge
Diese Seite steht im Kapitel über die Betriebsarten, und das Wort „Betriebsart“ trägt hier zwei Bedeutungen. Halte sie auseinander:
- Hat diese Installation Mandanten?
- steht in
codamai.persistence.tenant.mode - gilt für die Lebenszeit der Installation
- Läuft CIAS im selben Prozess wie CDMS oder als eigener Dienst?
- steht in
codamai.cias.tenancy.lookupund im Feldciasdes Systems - ändert nur, wie CDMS und CIAS miteinander reden
Die vier Kombinationen sind alle möglich. Ein eingebettetes CIAS in MULTI prüft den Mandanten über einen Methodenaufruf, ein getrenntes über HTTP — geprüft wird in beiden Fällen dasselbe. Und in SINGLE wird in beiden Bauformen gar nicht gefragt, weil es nichts zu fragen gibt. Siehe Eingebettet und getrennt im Vergleich.