Worum es geht
Steht fest, welcher Mandant gemeint ist, fragt die Filterkette als Nächstes, ob dieser Mandant heute überhaupt bedient wird. Diese Frage stellt das Mandanten-Tor, und beantworten kann sie nur CIAS – denn nur CIAS führt die Mandanten.
Diese Seite zeigt, wie die Frage gestellt wird. Was „bedient“ bedeutet und warum alle Ablehnungen gleich aussehen, steht unter Den Mandanten zulassen.
Eine Schnittstelle, zwei Adapter
Das Tor kennt CIAS nicht. Es kennt nur eine Schnittstelle, den TenantLookupPort, und dahinter steckt genau ein Adapter:
codamai.cias.tenancy.lookup = localLocalTenantLookupAdapterincias-tenancy, im selben Prozess- ein Methodenaufruf, der in die System-Datenbank schaut
- kein Netz, kein Token, kein Zeitlimit
- „Mandant unbekannt“ ist eine leere Antwort
codamai.cias.tenancy.lookup = remoteRemoteTenantLookupAdapterincias-tenancy-client, im CDMS-DienstGET /cias/lookup/tenants/{key}an den CIAS-Dienst- mit dem Dienst-Token des CDMS-Dienstes, voreingestellt 2 s Verbindung und 2 s Antwort
- „Mandant unbekannt“ ist ein 404
Die Einstellung lookup hat keinen Standardwert. Ein Dienst, der dazu nichts sagt, startet nicht. Ein Tor ohne Antwortgeber würde entweder alles durchlassen oder alles ablehnen, und beides wäre eine Entscheidung, die niemand getroffen hat.
Dieselbe Anfrage, zwei Wege
Wann: CIAS läuft im selben Prozess, etwa im Hub-Backend oder in einem generierten Projekt.
sequenceDiagram
participant F as Filterkette
participant T as Mandanten-Tor
participant A as LocalTenantLookupAdapter
participant DB as System-DB
F->>T: darf "kunde-a" bedient werden?
T->>T: schon gemerkt und jünger als 30 s?
T->>A: Methodenaufruf
A->>DB: Stellung und Gültigkeitsfenster lesen
DB-->>A: ACTIVE, gültig
A-->>T: bedient
T-->>F: zugelassen, 30 s gemerkt
Ergebnis: Kein Netzwerkaufruf. Der Vorrat spart eine Datenbankabfrage, mehr nicht.
Wann: CIAS läuft als eigener Dienst (cias-runtime).
sequenceDiagram
participant F as Filterkette
participant T as Mandanten-Tor
participant C as cias-tenancy-client
participant S as CIAS-Dienst
F->>T: darf "kunde-a" bedient werden?
T->>T: schon gemerkt und jünger als 30 s?
T->>C: frag nach
C->>S: GET /cias/lookup/tenants/kunde-a<br/>Authorization Bearer Dienst-Token
S->>S: darf dieser Aufrufer fragen?
S-->>C: 200 key kunde-a served true
C-->>T: bedient
T-->>F: zugelassen, 30 s gemerkt
Ergebnis: Ein zusätzlicher HTTP-Aufruf – aber nur, wenn nichts gemerkt ist.
Der Endpunkt verrät genau zwei Dinge: den Schlüssel und ob er bedient wird. Kein Anzeigename, keine Stellung, keine Daten. Und er hat eine eigene Rolle, getrennt von der Verwaltungs-API: sonst trüge jeder CDMS-Knoten ein Token, mit dem er Kunden schließen könnte, nur um eine Ja-Nein-Frage zu stellen.
Das Gedächtnis des Tors
Die Frage kommt bei jeder Anfrage, die Antwort ändert sich selten. Deshalb merkt sich das Tor jede Antwort – auch jedes Nein.
| Wert | Einstellung | |
|---|---|---|
| Wie lange eine Antwort gilt | 30 Sekunden | codamai.cias.tenant-gate.ttl |
| Wie viele Mandanten gemerkt werden | 10 000 | codamai.cias.tenant-gate.max-entries |
| Wo das Gedächtnis sitzt | im Speicher des CDMS-Prozesses, je Knoten | – |
Das Gedächtnis liegt in cias-authentication und damit in beiden Betriebsarten im CDMS-Prozess. Nicht im kleinen Client, nicht bei CIAS. Der Client selbst merkt sich nichts und versucht es auch kein zweites Mal: Ein Wiederholversuch würde die Wartezeit jeder Anfrage vervielfachen, bevor das Gedächtnis überhaupt zu Wort käme.
Ist der Vorrat voll, fliegen zuerst die abgelaufenen Einträge; hilft das nicht, wird er ganz geleert. Das kostet je Mandant eine Nachfrage – besser, als neue Antworten nicht mehr aufzunehmen.
Was das Tor antwortet
| Gemerkte Antwort | CIAS antwortet | CIAS sagt | Ergebnis für die Anfrage |
|---|---|---|---|
| jünger als 30 s | – | – | die gemerkte Antwort, ohne zu fragen |
| keine oder älter | ja | bedient | zugelassen, und gemerkt |
| keine oder älter | ja | nicht bedient | 403 tenant-not-served, und gemerkt |
| keine oder älter | ja | kennt den Mandanten nicht | 403 tenant-not-served, und gemerkt |
| vorhanden | nein | – | die gemerkte Antwort gilt weiter, auch wenn sie Nein war |
| keine | nein | – | 403 tenant-not-served |
Ein Schlüssel, der gar kein Mandantenschlüssel sein kann – etwa Nordbau mit Großbuchstaben –, wird behandelt wie ein unbekannter Mandant. Das Tor fragt dafür nicht einmal nach.
Die fünf Ausprägungen
Wann: Für diesen Mandanten liegt eine Antwort, die jünger als die Merkzeit ist.
Das Tor antwortet sofort aus dem Gedächtnis. Weder der Methodenaufruf noch der HTTP-Aufruf findet statt. Das ist der häufigste Fall, denn 30 Sekunden sind viele Anfragen.
Ergebnis: Kein Aufruf, keine Wartezeit.
Wann: Erste Anfrage für diesen Mandanten, oder die Merkzeit ist abgelaufen.
Ein Methodenaufruf in cias-tenancy, der Stellung und Gültigkeitsfenster in der System-Datenbank nachschlägt. Das dauert so lange wie eine Datenbankabfrage und kann nur scheitern, wenn die Datenbank nicht antwortet.
Ergebnis: Antwort, und 30 Sekunden gemerkt.
Wann: Dasselbe, aber CIAS ist ein eigener Dienst.
Ein HTTP-Aufruf mit dem Dienst-Token. 200 mit served ist die Antwort, 404 heißt „diesen Schlüssel hat kein Mandant“ – auch das ist eine Antwort und wird gemerkt.
Ergebnis: Antwort, und 30 Sekunden gemerkt.
Wann: Der CIAS-Dienst nimmt die Verbindung nicht an oder antwortet nicht rechtzeitig.
Nach 2 Sekunden Verbindungsaufbau beziehungsweise 2 Sekunden Warten auf die Antwort gilt CIAS als nicht erreichbar. Die Zeitlimits sind absichtlich kurz und absichtlich kein Stellknopf: Dieser Aufruf liegt auf dem Weg jeder Anfrage, und ein langsamer CIAS-Dienst wäre sonst eine langsame Plattform.
Ergebnis: Behandelt wie jeder andere Ausfall, siehe Wenn CIAS nicht erreichbar ist.
Wann: CIAS weist das Dienst-Token ab – es fehlt, ist abgelaufen oder trägt die Abfragerolle nicht.
Ein 401 oder 403 ist kein Urteil über den Kunden, sondern über die eigenen Zugangsdaten dieses Dienstes. Es wäre falsch, daraus „dieser Mandant wird nicht bedient“ zu machen: eine falsch eingerichtete Installation würde damit still alle Kunden aussperren.
Ergebnis: Deshalb ist es kein Nein über den Mandanten. Die Anfrage wird trotzdem sofort abgelehnt, auch wenn eine Antwort gemerkt ist, siehe Wenn CIAS nicht erreichbar ist.
Wann: Der CDMS-Dienst braucht ein neues Dienst-Token, aber Keycloak antwortet nicht.
Der Dienst holt sein Token selbst beim IAM (Client Credentials) und erneuert es, bevor es abläuft. Ist das alte Token noch gültig, nimmt er weiter das alte und versucht es nach 10 Sekunden erneut. Erst ohne gültiges Token wird die Frage an CIAS gar nicht erst gestellt.
Ergebnis: Das zählt wie ein Ausfall von CIAS: Gemerkte Antworten gelten weiter. Weist Keycloak dagegen den Client ab (falsches Secret, Client gesperrt), wird sofort abgelehnt.
Die zweite Frage: Attributwerte im Mandanten
Direkt hinter dem Tor steht eine zweite Frage derselben Bauart: Welche Attributwerte hält diese Person in diesem Mandanten? Ein Attribut ist ein Wert an einer Person, mit dem CDMS Zeilen aussiebt, etwa regionen. Manche Attribute gelten je Mandant getrennt.
| Mandanten-Tor | Attribut-Lookup | |
|---|---|---|
| Frage | Wird dieser Mandant bedient? | Was hält diese Person hier? |
| Eingebettet | Methodenaufruf in cias-tenancy | Methodenaufruf in cias-user |
| Getrennt | GET /cias/lookup/tenants/{key} | GET /cias/lookup/users/{id}/attributes?tenantKey=… |
| Merkzeit | 30 s (codamai.cias.tenant-gate.ttl) | 30 s (codamai.cias.attribute-lookup.ttl) |
| Gefragt wird | bei jeder Anfrage mit Mandant | bei jeder Anfrage mit Mandant, wenn ein Modul ein Attribut pro Mandant angemeldet hat |
Beide benutzen dieselbe Merkzeit, dasselbe Dienst-Token und dieselbe Regel bei einem Ausfall. Ein Unterschied ist wichtig: Beim Attribut-Lookup ist ein 404 keine Antwort, sondern ein Fehler. Eine Person, von der CIAS nichts weiß, bekommt 200 mit einer leeren Liste – ein 404 heißt also „diesen Endpunkt gibt es nicht“, etwa weil die Adresse falsch ist. Mehr dazu unter Ein Wert pro Person oder pro Mandant.
Nach einem Mandantenwechsel wird noch einmal gefragt
Trägt eine Anfrage den Header tenant und darf die Person wechseln, steht am Ende der Filterkette ein anderer Mandant im RequestContext als der, den das Tor eben zugelassen hat. Dann fragt das Tor erneut, diesmal für das Ziel:
-
1CIASlöst den Mandanten aus dem Token auf und fragt das Tor
-
2CIASbildet Rollen und Attribute für diesen Mandanten
-
3CIASprüft den Header
tenantgegen die Realm-Rolle und die Liste der erlaubten MandantenFehlt die Rolle oder steht das Ziel nicht in der Liste, wird der Wechsel still ignoriert. -
4CIASHat sich der Mandant geändert, fragt das Tor noch einmal – meist ein Treffer aus dem GedächtnisErgebnis: Alles hinter der Filterkette darf sich darauf verlassen, dass der Mandant im RequestContext einer ist, den CIAS bestätigt hat. Auch für einen Administrator: Ein gesperrter Mandant ist für jeden gesperrt.
Mehr zum Wechsel selbst: Mandantenwechsel per Header.
Fallen
Weiter
- Den Mandanten zulassen (Mandanten-Tor): was „bedient“ heißt und warum alle Ablehnungen gleich aussehen
- Wenn CIAS nicht erreichbar ist
- Der Weg des Tokens und Von der Anmeldung bis zu den Daten
- CIAS eingebettet, CIAS als eigener Service, im Vergleich
- Die Sicht von CDMS: Wird der Mandant bedient?