CodamAIDocs
Themafertig

Ein neuer Mandant, Ende zu Ende

Vom Anlegen in CIAS über die Organisation in Keycloak und die Datenbank bis zur ersten Anfrage in CDMS, die für diesen Mandanten durchs Tor geht.

Ausprägungen
über die Verwaltungüber die Selbstregistrierungeingebettetgetrennt

Worum es geht

Ein neuer Kunde bedeutet für die Plattform vier Dinge, die an vier verschiedenen Orten entstehen:

WasWo
der Datensatz des Mandantenin der Datenbank von CIAS
gegebenenfalls eine Organisationin Keycloak
eine Datenbank mit ihrem Schemadort, wo CDMS seine Daten hält
die Konten der Personen mit ihren Rollenin Keycloak, dazu Benutzerdatensätze in CIAS

Eine gemeinsame Transaktion über alle vier gibt es nicht. Deshalb hält CIAS jeden Schritt einzeln fest, damit ein halb fertiger Kunde erkennbar ist und repariert werden kann.

Der ganze Weg in einem Bild

Der Normalfall: ein Plattform-Administrator legt den Mandanten an, CDMS und CIAS laufen im selben Prozess, die Datenhaltung ist auf MULTI eingestellt.

sequenceDiagram
    autonumber
    participant A as Admin
    participant C as CIAS
    participant CDB as CIAS-Datenbank
    participant P as CDMS-Persistenz
    participant TDB as Mandanten-DB
    participant K as Keycloak
    participant U as Client von nordbau

    A->>C: POST /cias/admin/tenants {key: nordbau, type: STATIC}
    C->>C: Rolle des Aufrufers prüfen
    C->>CDB: Transaktion 1 – Schlüssel frei? speichern als PENDING / IN_PROGRESS
    CDB-->>C: gespeichert
    C->>P: richte nordbau ein
    P->>TDB: CREATE DATABASE nordbau
    P->>TDB: Schema auf den Stand der Modelle bringen
    TDB-->>P: fertig
    P-->>C: eingerichtet
    C->>CDB: Transaktion 2 – PROVISIONED, dann ACTIVE
    C-->>A: 200 mit dem Mandanten

    Note over A,K: Jetzt bekommen die Menschen Zugang
    A->>C: Person anlegen oder einladen, Rollen vergeben
    C->>K: Konto, Mitgliedschaft, Rollen
    C->>CDB: Benutzerdatensatz

    Note over U,TDB: Die erste Anfrage
    U->>C: POST /api/rest/crm/customer/query + Token
    C->>C: Token prüfen, Mandant auflösen
    C->>C: Wird nordbau bedient?
    C->>U: Antwort aus der Mandanten-DB

Drei Dinge an dieser Form sind Absicht:

  1. Absicht zuerst speichern. Stürzt der Prozess danach ab, ist wenigstens etwas da, das man wiedererkennt: ein Mandant in IN_PROGRESS mit Startzeit.
  2. Einrichten ohne offene Transaktion. Eine Datenbank anzulegen und zu migrieren kann dauern. Liefe das in einer Transaktion, hielte CIAS so lange eine Verbindung und ihre Sperren fest.
  3. Ergebnis danach speichern, Erfolg wie Misserfolg, jeweils in einer eigenen kurzen Transaktion.

Die Stationen bis zur ersten Anfrage

Was erfüllt sein muss, bevor der erste Kunde arbeitet
  1. CIAS
    Datensatz
    Ist der Schlüssel frei und gültig?
    ↳ nein abgelehnt, es wird nichts angelegt
  2. CDMS
    Einrichtung
    Steht die Datenbank mit ihrem Schema?
    ↳ nein Rollout FAILED, der Mandant wird nicht bedient — Neuversuch möglich
  3. CIAS
    Stellung
    Ist der Mandant ACTIVE und innerhalb seines Gültigkeitsfensters?
    ↳ nein das Tor lehnt jede Anfrage ab
  4. Keycloak
    Zugang
    Nennt das Token der Person genau diesen Mandanten?
    ↳ nein die Filterkette lehnt ab, bevor CDMS erreicht wird
  5. CIAS
    Mandanten-Tor
    Wird nordbau heute bedient?
    ↳ nein abgelehnt, ohne zu verraten warum
  6. Die Anfrage erreicht CDMS und liest aus der Datenbank von nordbau

Die letzten drei Stationen laufen bei jeder Anfrage, nicht nur bei der ersten. Einzelheiten unter Die Mandantenprüfung in beiden Betriebsarten.

Die Varianten

Wie ein Mandant entsteht

Wann: Ein Plattform-Administrator legt ihn an, meistens weil ein Vertrag zustande gekommen ist.

  1. 1
    Admin→CIAS
    POST /cias/admin/tenants mit Schlüssel, Art und Anzeigenamen
    Nur ein Plattform-Administrator. Ein Mandanten-Administrator darf keine Mandanten anlegen — das ist genau die Grenze, die Kunden voneinander trennt.
  2. 2
    CIAS
    legt keine Organisation in Keycloak an
    Bei einem dynamischen Mandanten verweist das Feld externalOrganizationId auf eine Organisation, die es dort schon gibt.
  3. 3
    CIAS→CDMS
    richtet die Datenbank ein und aktiviert den Mandanten

Ergebnis: Der Mandant ist da und leer. Menschen kommen getrennt dazu, über Anlegen oder Einladen.

Wann: Eine Firma trägt sich selbst ein, und die Zuordnung steht auf „neuen Mandanten gründen“.

  1. 1
    Benutzer→CIAS
    füllt das Formular aus, inklusive Firmenname
  2. 2
    CIAS→E-Mail
    schickt den Bestätigungslink; erst der bestätigte Klick löst irgendetwas aus
  3. 3
    CIAS→Keycloak
    legt zuerst die Organisation an, ihr Kürzel ist der Mandantenschlüssel
  4. 4
    CIAS
    legt dann den Mandanten an, Art DYNAMIC, mit Verweis auf die Organisation — inklusive Datenbank
  5. 5
    CIAS→Keycloak
    macht die Person zum Mitglied, setzt ihre Mandanten-Attribute und vergibt die Gründerrollen

Ergebnis: Mandant, Organisation und erste Person entstehen in einem Zug. Einzelheiten unter Was beim Abschluss passiert.

Wann: CDMS und CIAS laufen im selben Prozess.

Die Bitte „richte nordbau ein“ ist ein Methodenaufruf. In MULTI legt CDMS die Datenbank an und migriert das Schema, in SINGLE gibt es nichts zu tun und die Einrichtung meldet sofort Erfolg.

Ergebnis: Scheitert die Einrichtung, merkt es der Betrieb beim Anlegen und nicht der Kunde bei seiner ersten Anfrage.

Wann: CIAS ist ein eigener Dienst, ohne CDMS-Persistenz im Prozess.

CIAS hat keine Mandanten-Datenbanken und richtet deshalb nichts ein; die Einrichtung meldet sofort Erfolg, und beim Start steht einmal fest, dass diese Installation nichts bereitstellt. Die Datenbank legt der CDMS-Dienst bei der ersten Anfrage für diesen Mandanten selbst an, sofern Anlegen dort freigegeben ist.

Ergebnis: Der Mandant ist sofort aktiv, und die erste Anfrage des Kunden dauert länger. Ist Anlegen nicht freigegeben, scheitert sie.

Wo die Datenbank entsteht

Wer legt die Datenbank des Mandanten an?
CDMS-Persistenz im selben Prozess?BetriebsartWas beim Anlegen passiert
jaMULTICDMS legt Datenbank und Schema sofort an
jaSINGLEnichts — es gibt nur die eine Datenbank
nein–nichts. Der CDMS-Dienst legt sie bei der ersten Anfrage an

Welche Datenbank ein Zugriff trifft und wann sie angelegt wird, steht unter Datenbanken, Pools, Migration und Datenbanken und Schemata.

Die Zustände unterwegs

StellungRolloutWas gerade los ist
PENDINGIN_PROGRESSDie Einrichtung läuft. Der Mandant wird nicht bedient
PENDINGFAILEDDie Einrichtung ist gescheitert. Ein Neuversuch ist möglich
ACTIVEPROVISIONEDNormalbetrieb
SUSPENDEDPROVISIONEDGesperrt, die Daten bleiben

Gelingt alles, ist der Mandant sofort aktiv; PENDING sieht man nur, solange die Einrichtung läuft oder gescheitert ist. Der ganze Lebenslauf steht unter Der Lebenslauf eines Mandanten, das Anlegen im Einzelnen unter Einen Mandanten anlegen und bereitstellen.

Stirbt der Prozess zwischen den beiden Transaktionen, bleibt der Mandant in IN_PROGRESS stehen, und der Neuversuch nimmt nur FAILED an. Dafür gibt es einen Zeitgeber, der liegengebliebene Einrichtungen nach einer Frist auf FAILED setzt. Er kommt mit dem Starter und ist dort standardmäßig aus; der eigenständige CIAS-Dienst schaltet ihn ein.

Vom Mandanten zur ersten Anfrage

Ein angelegter Mandant reicht nicht. Die Anfrage einer Person muss diesen Mandanten nennen, und woher sie das tut, hängt an der Art des Mandanten:

Wie eine Anfrage ihren Mandanten nennt
Statischer Mandant
keine Organisation in Keycloak
  • Das Konto trägt die Attribute tenant und allowedTenants
  • Die Mitgliedschaft ist das Attribut
  • Rollen werden global vergeben
Dynamischer Mandant
eine Organisation in Keycloak
  • Das Kürzel der Organisation im Token nennt den Mandanten
  • Die Mitgliedschaft ist die Mitgliedschaft in der Organisation
  • Rollen werden in der Organisation vergeben und stehen im Organisations-Claim

Danach ist der Weg für beide gleich: Die Filterkette löst den Mandanten auf, das Mandanten-Tor fragt CIAS, ob er bedient wird, und merkt sich die Antwort kurz. Erst dann erreicht die Anfrage CDMS. Der ganze Weg steht unter Vom Login bis zu den Daten.

Fallen

Weiter

Quellen im Code und in der Wissensdatenbank
  • CIAS/cias-tenancy – TenantService (createTenant, rollOut, retryProvisioning, standing), Tenant (markProvisioningStarted, completeRollout, markProvisioned, markProvisioningFailed, activate), TenantStatus, ProvisioningState, TenantAdminController (POST /cias/admin/tenants)
  • CIAS/cias-registration – RegistrationService (provision, assignTenant, grantRoles), TenantAssignment CREATE_NEW
  • CIAS/cias-spring-boot-starter – CiasTenantProvisioningAutoConfiguration (kein Rollout ohne eigene Persistenz), CiasBootstrap.createFirstTenant, TenantReconciliationScheduler
  • commons-persistence – TenantProvisioningConfiguration (MULTI/SINGLE), DatabaseTenantProvisioningAdapter, NoOpTenantProvisioningAdapter, TenantEntityManagerFactory.buildFactory, DataSourceManager (decideTenantDatabaseAction, createDatabase)
  • CIAS/cias-authentication – TenantGate (Zulassen, 30 s), TokenParser; CIAS/cias-tenancy – LocalTenantLookupAdapter, TenantLookupController
  • CIAS/cias-iam-keycloak – KeycloakOrganizationAdapter; CIAS/cias-runtime – application.yml (flows SELF_SERVICE, tenant-assignment CREATE_NEW)
Suchen