CodamAIDocs
Themafertig

SINGLE und MULTI über beide Module

Was die Betriebsart der Datenhaltung in CDMS und in CIAS bewirkt, und dass derselbe Schalter auch bestimmt, ob der Mandant im Token geprüft wird.

Ausprägungen
SINGLEMULTISchalter fehltein Schalter für Datenhaltung und Mandantenprüfung

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

Was die Betriebsart wo bewirkt
SINGLEMULTI
CDMS: Datenbankeneine, sie heißt singleeine System-Datenbank plus eine je Mandant
CDMS: wohin Mandanten- und Benutzer-Modelle gehenin dieselbe Datenbank wie die System-Modellein die Datenbank des Mandanten der Anfrage
CDMS: Dateiablageein Verzeichnisbaum, ohne Mandanten-Ebeneein Verzeichnis je Mandant
CDMS: neuer Mandantnichts einzurichten, der Mandant ist sofort aktivDatenbank anlegen und migrieren
CIAS: Mandant im Tokenwird übergangen, weder geprüft noch abgelehntwird aufgelöst, aus Organisation oder Attribut
CIAS: Mandanten-Torwird nie gefragtwird für jeden aufgelösten Mandanten gefragt
CIAS: Anfrage ohne Mandantenzugelassen403 tenant-required, außer auf /cias/**
CIAS: Liste der erlaubten Mandantenbleibt leereigener Mandant plus Organisationen
CIAS: Header tenantbewirkt nichts, auch mit Rolleerlaubt den Wechsel in einen Mandanten dieser Liste
CIAS: Rollen aus einer Organisationgelten nichtgelten im gewählten Mandanten
CIAS: Mandanten führenmöglich, wirkt sich aber auf keine Anfrage ausmöglich und nötig

Die Einzelheiten stehen auf den beiden Modulseiten, und dort gehören sie auch hin:

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 fragtAntwort bei MULTIAntwort bei SINGLEAntwort, wenn nichts gesetzt ist
Muss eine angemeldete Anfrage einen Mandanten nennen?janeinnein
Soll der Mandant im Token übergangen werden?neinjanein

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.

Die drei Zustände der Einstellung
WertCDMS-Persistenz im Prozess?Was passiert
MULTIjaTrennung nach Mandanten, Mandant im Token ist Pflicht
SINGLEjaeine Datenbank, Mandant im Token wird übergangen
nicht gesetztjaStart scheitert, die Meldung nennt die Einstellung
nicht gesetztneinMandanten 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:

SINGLE / MULTI
Betriebsart der Datenhaltung
  • Hat diese Installation Mandanten?
  • steht in codamai.persistence.tenant.mode
  • gilt für die Lebenszeit der Installation
eingebettet / getrennt
Bauform des Betriebs
  • Läuft CIAS im selben Prozess wie CDMS oder als eigener Dienst?
  • steht in codamai.cias.tenancy.lookup und im Feld cias des 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.

Fallen

Weiter

Quellen im Code und in der Wissensdatenbank
  • commons-persistence – TenantProperties (codamai.persistence.tenant.mode, @NotNull), TenantMode, DataSourceManager.getConnection, TenantEntityManagerFactory.cacheKey (single), DatabaseRequestContext.resolveTenant, TenantProvisioningConfiguration (NoOp bei SINGLE), TenantModeConsistencyCheck
  • CDMS/cdms-localfs-storage – LocalFSFileController.getPathForCurrentTenant (isMultiTenant)
  • CIAS/cias-kernel – TenantRequirement (required, ignoresTenants, bindet codamai.persistence.tenant)
  • CIAS/cias-authentication – TokenParser.admit (tenantless → TenantResolution.none), JwtSessionFilter.tenantMissing, TenantGate.admit
  • CIAS/cias-tenancy – CiasTenancyConfiguration (Provisioning kommt aus commons-persistence)
  • CDMS/cdms-scaffold – CdmsReadmeWriter (MULTI/SINGLE im erzeugten Projektrahmen)
  • CIAS/cias-authentication/docs/adr – ADR-035; CIAS/cias-kernel/docs/adr – ADR-022
Suchen