Worum es geht
Auf dieser Lernseite kommen immer wieder dieselben neun Wörter vor. Hier steht jedes mit einem Satz und einem kleinen Bild. Die Einzelheiten stehen jeweils auf der Seite, auf die der Abschnitt verweist.
Die Landkarte
So hängen die neun Begriffe zusammen:
flowchart LR
U["Benutzer"] -- "gehört zu" --> M["Mandant"]
U -- "Mitglied in" --> G["Gruppe"]
G -- "bündelt" --> R["Rolle"]
U -- "hat" --> R
U -- "hat Werte für" --> A["Attribut"]
M --> T(["Token"])
R --> T
A --> T
T -- "bei jeder Anfrage" --> D["CDMS"]
D -- "Rolle erlaubt Operation auf" --> Mo["Modell"]
Mo -- "ruft auf" --> H["Hook"]
Mo -- "hält fest" --> Rv["Revision"]
Die linke Hälfte gehört zu CIAS und Keycloak: Wer ist die Person, wo gehört sie hin, was darf sie? Die rechte Hälfte gehört zu CDMS: Welche Daten gibt es, und was passiert mit ihnen? Das Token ist die Brücke dazwischen.
Token
Ein Token ist ein signierter Ausweis, den Keycloak nach der Anmeldung ausstellt und den der Client bei jeder Anfrage mitschickt.
flowchart LR
K["Keycloak<br/>stellt aus, signiert"] --> T(["Token<br/>wer, Mandant,<br/>Rollen, Attribute"])
T --> F["Filterkette<br/>prüft, liest aus"]
F --> RC["RequestContext<br/>gilt für eine Anfrage"]
Die Filterkette von CIAS prüft Signatur und Ablauf selbst, ohne Keycloak zu fragen. Dann legt sie das Ergebnis in den RequestContext, und CDMS liest nur noch dort. Was im Token steht, gilt bis zu seinem Ablauf. Ein entzogenes Recht verschwindet deshalb erst mit dem nächsten Token.
Mehr: Was bei jeder Anfrage mit dem Token passiert, Was aus dem Token gelesen wird, Warum ein Rechteentzug verzögert wirkt
Mandant
Ein Mandant ist ein Kunde, dessen Daten von den Daten aller anderen Kunden getrennt bleiben.
flowchart LR
A(["Anfrage im<br/>Mandanten nordbau"]) --> DA[("Datenbank<br/>nordbau")]
A -. "nie" .-> DB[("Datenbank<br/>suedlogistik")]
CIAS führt die Mandanten. Welcher Mandant für eine Anfrage gilt, kommt aus dem Token: bei einem dynamischen Mandanten aus der Organisation in Keycloak, bei einem statischen aus dem Attribut tenant. Danach fragt das Mandanten-Tor CIAS, ob dieser Mandant gerade bedient wird. In der Betriebsart MULTI hat jeder Mandant eine eigene Datenbank. In SINGLE gibt es keine Mandanten.
Mehr: Mandant, Organisation, Gruppe, Den Mandanten zulassen (Mandanten-Tor), SINGLE und MULTI
Benutzer
Ein Benutzer ist eine Person, die in Keycloak ein Konto zum Anmelden und in CIAS einen Datensatz mit ihrer fachlichen Bedeutung hat.
flowchart LR
C["CIAS-Datensatz<br/>Status, Heimatmandant"] -- "verweist auf" --> K["Keycloak-Konto<br/>Passwort, MFA"]
K -- "ID als sub<br/>im Token" --> D["CDMS<br/>_userId, Historie"]
Beide Hälften hängen an der ID des Kontos in Keycloak. Im Token steht sie als sub. CDMS kennt nur diese ID und den Namen aus dem Token. Es trägt die ID etwa in _userId ein und in die Historie.
Mehr: Der Benutzerdatensatz, Der Lebenslauf eines Benutzers
Rolle
Eine Rolle ist ein benanntes Recht wie hr-employee-read, das im Token steht und das CDMS mit den Rollen eines Modells vergleicht.
flowchart LR
M["Modul<br/>meldet an"] --> C["CIAS<br/>Katalog, Vergabe"]
C --> K["Keycloak"]
K --> T(["Token"])
T --> D["CDMS<br/>Modellrolle prüfen"]
Ein Modul meldet seine Rollen an, CIAS führt sie im Rollenkatalog, vergibt sie und schreibt sie nach Keycloak. CDMS prüft nicht einfach die Rollen im Token, sondern die effektiven Rollen, die die Filterkette daraus bildet: Hat die Person in ihrem aktiven, dynamischen Mandanten eigene Rollen, ersetzen diese die global vergebenen Client-Rollen. Realm-Rollen gelten immer.
Mehr: Der Rollenkatalog, Effektive Rollen: global oder im Mandanten, Modellrollen, Wie eine Rolle aus dem Code ins Token kommt
Gruppe
Eine Gruppe ist ein Bündel von Rollen, und wer Mitglied ist, bekommt alle Rollen der Gruppe.
flowchart LR
A["Anna"] -- "Mitglied" --> G["Gruppe<br/>support"]
B["Ben"] -- "Mitglied" --> G
G --> R1["customer-read"]
G --> R2["order-edit"]
Eine Gruppe gilt plattformweit und gehört zu keinem Mandanten. Mitglied sein heißt: dieselben Rollen. Es heißt nicht, dass du die Daten der anderen Mitglieder siehst. CIAS führt die Gruppe, Keycloak hält eine Kopie, damit die Rollen ins Token kommen.
Mehr: Was eine Gruppe ist, Gruppenrollen unter dynamischen Mandanten
Attribut
Ein Attribut ist ein benannter Wert an einer Person, etwa projects = alpha, beta, mit dem CDMS die sichtbaren Zeilen einschränkt.
flowchart LR
V(["projects =<br/>alpha, beta"]) --> F["Attributfilter<br/>in CDMS"]
F --> W["nur Zeilen mit<br/>project IN (alpha, beta)"]
Ein Attribut gilt entweder pro Person (USER): Dann kommt der Wert über das Token. Oder es gilt pro Person und Mandant (USER_IN_TENANT): Dann holt CIAS bei jeder Anfrage den Wert für den aktiven Mandanten und ersetzt damit den Wert aus dem Token. Im Attributfilter hebt ein * die Einschränkung auf, ein fehlendes Attribut lässt die Anfrage scheitern.
Mehr: Zwei Herkünfte von Attributen, Ein Wert pro Person oder pro Mandant, Attributfilter
Modell
Ein Modell beschreibt ein Ding deiner Fachlichkeit, etwa Customer, mit Feldern, Beziehungen, Endpunkten, Rollen und Filtern.
flowchart LR
H["Hub<br/>Modell Customer"] --> B["Build<br/>Generator"]
B --> A["Tabelle, Endpunkte,<br/>Rollen, Filter"]
Du beschreibst das Modell im Hub, der Build erzeugt daraus den Code. Die Ebene des Modells (System, Mandant oder Benutzer) legt fest, in welcher Datenbank seine Daten liegen und wer welche Zeilen sieht.
Mehr: Modellieren im Hub, Modell-Ebenen: System, Mandant, Benutzer, Welche Endpunkte ein Modell hat
Hook
Ein Hook ist eine Klasse in deinem Projekt, die CDMS an festen Stellen eines Standardablaufs aufruft, damit du eigene Fachlogik einhängen kannst.
flowchart LR
A(["PATCH"]) --> BH["before-Hook<br/>darf noch ändern"]
BH --> DB[("Datenbank")]
DB --> AH["after-Hook"]
AH --> R(["Antwort"])
Ein Hook gehört zu einem Modell. Er läuft vor der Datenbankänderung (before) oder danach (after), beim Lesen nur danach. Beide laufen in der Transaktion der Anfrage. Auch die Registrierung in CIAS hat eigene Hooks, mit denen ein Projekt den Ablauf anpasst.
Mehr: Hooks: Arten und Zeitpunkte, Die Reihenfolge in einem Schreibvorgang, Eigene Logik: Hooks und Events
Revision
Eine Revision ist ein gespeicherter Stand eines Objekts nach einer Änderung, mit Nummer, Zeitpunkt und handelnder Person.
flowchart LR
R1["17 · ADD"] --> R2["42 · MOD"]
R2 --> R3["58 · MOD<br/>Rollback auf 17"]
R3 --> R4["63 · DEL"]
Revisionen gibt es nur bei auditierten Modellen. Alle Revisionen eines Objekts zusammen sind seine Historie. Ein Rollback schreibt den alten Stand als neue Revision, die Historie wird nie umgeschrieben. Die Nummern zählen je Datenbank, also je Mandant.
Mehr: Was auditiert wird, Was eine Revision festhält, Auf einen alten Stand zurücksetzen
Alle Begriffe in einer Tabelle
| Begriff | In einem Satz | Geführt von | Weiter |
|---|---|---|---|
| Token | signierter Ausweis für jede Anfrage | Keycloak stellt aus, die Filterkette von CIAS liest | Token-Prüfung |
| Mandant | Kunde mit getrennten Daten | CIAS | Mandant, Organisation, Gruppe |
| Benutzer | Person mit Konto und Datensatz | Keycloak (Anmeldung), CIAS (fachlich) | Der Benutzerdatensatz |
| Rolle | benanntes Recht im Token | Modul meldet an, CIAS vergibt, CDMS prüft | Der Rollenkatalog |
| Gruppe | Bündel von Rollen mit Mitgliedern | CIAS | Was eine Gruppe ist |
| Attribut | Wert an einer Person, schränkt Zeilen ein | CIAS schreibt, CDMS filtert | Attributfilter |
| Modell | Ding deiner Fachlichkeit | Hub, daraus der generierte Code | Modellieren im Hub |
| Hook | eigene Fachlogik im Ablauf | dein Projekt | Hooks |
| Revision | gespeicherter Stand nach einer Änderung | CDMS | Was auditiert wird |