CodamAIDocs
Themafertig

Die Mandantenprüfung in beiden Betriebsarten

Wie das Mandanten-Tor eingebettet per Methodenaufruf und getrennt per HTTP fragt, mit Cache, Zeitlimit und Fehlerbehandlung.

Ausprägungen
eingebettetgetrenntCache-TrefferZeitüberschreitung403 vom Lookup

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:

Wer die Frage beantwortet
Eingebettet
codamai.cias.tenancy.lookup = local
  • LocalTenantLookupAdapter in cias-tenancy, im selben Prozess
  • ein Methodenaufruf, der in die System-Datenbank schaut
  • kein Netz, kein Token, kein Zeitlimit
  • „Mandant unbekannt“ ist eine leere Antwort
Getrennt
codamai.cias.tenancy.lookup = remote
  • RemoteTenantLookupAdapter in cias-tenancy-client, im CDMS-Dienst
  • GET /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

„Wird kunde-a bedient?“

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.

WertEinstellung
Wie lange eine Antwort gilt30 Sekundencodamai.cias.tenant-gate.ttl
Wie viele Mandanten gemerkt werden10 000codamai.cias.tenant-gate.max-entries
Wo das Gedächtnis sitztim 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

Alle Fälle auf einen Blick
Gemerkte AntwortCIAS antwortetCIAS sagtErgebnis für die Anfrage
jünger als 30 s––die gemerkte Antwort, ohne zu fragen
keine oder älterjabedientzugelassen, und gemerkt
keine oder älterjanicht bedient403 tenant-not-served, und gemerkt
keine oder älterjakennt den Mandanten nicht403 tenant-not-served, und gemerkt
vorhandennein–die gemerkte Antwort gilt weiter, auch wenn sie Nein war
keinenein–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

Was in der Praxis passiert

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-TorAttribut-Lookup
FrageWird dieser Mandant bedient?Was hält diese Person hier?
EingebettetMethodenaufruf in cias-tenancyMethodenaufruf in cias-user
GetrenntGET /cias/lookup/tenants/{key}GET /cias/lookup/users/{id}/attributes?tenantKey=…
Merkzeit30 s (codamai.cias.tenant-gate.ttl)30 s (codamai.cias.attribute-lookup.ttl)
Gefragt wirdbei jeder Anfrage mit Mandantbei 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:

Wechsel und zweite Frage
  1. 1
    CIAS
    löst den Mandanten aus dem Token auf und fragt das Tor
  2. 2
    CIAS
    bildet Rollen und Attribute für diesen Mandanten
  3. 3
    CIAS
    prüft den Header tenant gegen die Realm-Rolle und die Liste der erlaubten Mandanten
    Fehlt die Rolle oder steht das Ziel nicht in der Liste, wird der Wechsel still ignoriert.
  4. 4
    CIAS
    Hat sich der Mandant geändert, fragt das Tor noch einmal – meist ein Treffer aus dem Gedächtnis
    Ergebnis: 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

Quellen im Code und in der Wissensdatenbank
  • CIAS/cias-authentication – TenantGate (admit, Cache, Ausfallzweig, remember, invalidate), TenantGateProperties (ttl 30s, max-entries 10000), AttributeLookup, AttributeLookupProperties, TenantAdmission, TokenParser.admit (Reihenfolge, zweite Frage nach dem Wechsel), ContextSwitch
  • CIAS/cias-kernel – TenantLookupPort, TenantStanding, TenantKey.isValid, TenantBoundAttributePort
  • CIAS/cias-tenancy – LocalTenantLookupAdapter, TenantLookupController (GET /cias/lookup/tenants/{key}), TenantLookupRoles, CiasTenancyConfiguration (lookup, lookup-rest)
  • CIAS/cias-tenancy-client – RemoteTenantLookupAdapter (200/404/401/403/sonst, fehlendes `served`), RemoteTenantBoundAttributeAdapter (404 ist Ausfall), CiasTenancyClientProperties (base-url, connect-timeout 2s, request-timeout 2s), ClientCredentialsTenantLookupCredentials (Dienst-Token vom IAM), StaticTenantLookupCredentials, JdkLookupTransport
  • CIAS/cias-authentication/docs/adr – ADR-021; CIAS/cias-kernel/docs/adr – ADR-022; CIAS/cias-authentication/docs/adr – ADR-042
Suchen