CodamAIDocs
Themafertig

Die drei Ebenen im Überblick

Modell (darf ich diese Operation?), Beziehung (darf ich über dieses Feld?) und Zeile (darf ich dieses Objekt?). Wie die Ebenen hintereinander greifen.

Ausprägungen
Lesen und SuchenÄndern und LöschenAnlegenverschachtelte Anfrage

Worum es geht

Jede Anfrage an CDMS muss mehrere Fragen bestehen, bevor Daten fließen. Die Fragen stehen auf drei Ebenen:

EbeneFrageWomit CDMS sie beantwortet
ModellDarfst du diese Operation auf diesem Modell ausführen?einer Rolle im Token, z. B. hr-employee-read
BeziehungDarfst du über dieses Feld in ein anderes Modell hinein?der Rolle des anderen Modells oder einer Feldrolle an der Beziehung
ZeileDarfst du genau dieses Objekt sehen oder ändern?Filtern: eigene Daten, Attributfilter, eigene Filter des Projekts

Eine Rolle ist ein Name wie hr-employee-read, der im Token der Person steht. Ein Filter ist eine Bedingung, die CDMS unsichtbar an jede Abfrage hängt, etwa „nur Zeilen dieser Person“.

Der Trichter

Vor den drei Ebenen steht noch der Mandant. Er ist keine Prüfung in CDMS, sondern legt fest, in welcher Datenbank CDMS überhaupt sucht.

flowchart TB
    T["Token und Mandant<br/>CIAS prüft das Token, wählt den Mandanten"] --> M
    M["Modell<br/>Rolle für die Operation?"] --> B
    B["Beziehung<br/>Rolle des Zielmodells oder Feldrolle?"] --> Z
    Z["Zeile<br/>eigene Daten, Attributfilter, eigene Filter"] --> D["Daten"]
    T -. "kein oder ungültiges Token" .-> E1["401 / 403"]
    M -. "Rolle fehlt" .-> E2["403"]
    B -. "Rolle fehlt" .-> E3["403"]
    Z -. "Zeile unsichtbar" .-> E4["404 oder nicht in der Liste"]

Was vor CDMS passiert, also Token prüfen und Mandant wählen, steht unter Zugriff ohne Token und Mandanten.

Die Ebenen beim Lesen

POST /hr/employee/read/{id} mit Firma in der response
  1. CDMS
    Modell
    Hast du die Leserolle von employee?
    ↳ nein 403 missing-permission|<leserolle>
  2. CDMS
    Zeile
    Lassen die Filter von employee diese Zeile durch?
    ↳ nein 404 not-found
  3. CDMS
    Beziehung
    Die response nennt company. Hast du die Leserolle von company oder die Feldrolle an employee.company?
    ↳ nein 403 missing-permission|<rolle>
  4. CDMS
    Zeile der Firma
    Lassen die Filter von company die Firma durch?
    ↳ nein company ist null, kein Fehler
  5. 200 mit Mitarbeiter und Firma

Beim Suchen gilt dasselbe, nur fehlen unsichtbare Zeilen einfach in der Liste. Siehe Filter, die immer mitlaufen.

Die Ebenen beim Ändern und Löschen

Beim Schreiben ist die Reihenfolge anders: Erst prüft CDMS die Zeile, dann die Rolle.

PATCH /hr/employee/update/{id}
  1. CDMS
    Zeile
    Gibt es die Zeile, und lassen die Filter sie durch? Dieselben Filter wie beim Lesen.
    ↳ nein 404 not-found|<Dto>|<id>
  2. CDMS
    Modell
    Hast du die Änderungsrolle von employee?
    ↳ nein 403 missing-permission|<änderungsrolle>
  3. CDMS
    Beziehung
    Ändert die Anfrage ein Kind mit? Dann brauchst du dessen Rolle oder die Feldrolle.
    ↳ nein 403 missing-permission|<rolle>
  4. 200, geändert und zurückgelesen

So verrät CDMS nicht, ob es ein fremdes Objekt gibt: Wer es nicht sehen darf, bekommt 404, egal welche Rollen er hat. Siehe Warum Unsichtbares 404 liefert.

Die Ebenen im Vergleich

Was jede Ebene entscheidet
Modell
Rolle je Operation
  • gilt für alle Zeilen des Modells
  • fehlt → 403
  • Details: Modellrollen
Beziehung
Rolle des Zielmodells oder Feldrolle
  • gilt nur für den Weg über dieses Feld
  • fehlt → 403
  • Details: Feldrollen
Zeile
Filter

Einfache Felder haben keine eigene Ebene. Wer ein Modell lesen darf, darf seine einfachen Felder lesen, außer ein Feld trägt eine eigene Rolle. Dann braucht er zusätzlich diese Rolle, sonst fehlt das Feld in der Antwort. Siehe Geschützte Werte.

Varianten

Welche Ebenen eine Anfrage durchläuft

Wann: read, query

  1. 1
    CDMS
    prüft die Leserolle des Modells
  2. 2
    CDMS→Database
    liest nur Zeilen, die alle Filter durchlassen
  3. 3
    CDMS
    prüft für jede Beziehung in der response die Rolle des Zielmodells oder die Feldrolle

Ergebnis: Rolle fehlt → 403. Unsichtbar → 404 beim Lesen per id, bei der Suche fehlt die Zeile.

Wann: PUT, PATCH, DELETE, rollback

  1. 1
    CDMS→Database
    zählt die Zeile mit den Filtern des Lesens
  2. 2
    CDMS
    prüft die Rolle des Modells für die Operation
  3. 3
    CDMS
    prüft für jedes mitgeänderte oder mitgelöschte Kind dessen Rolle oder die Feldrolle

Ergebnis: Erst 404, dann 403. Eine Leserolle brauchst du dafür nicht.

Wann: create

  1. 1
    CDMS
    prüft die Anlegerolle des Modells
  2. 2
    CDMS
    prüft für jedes mitangelegte Kind dessen Rolle oder die Feldrolle
  3. 3
    CDMS
    liest das neue Objekt zurück, dafür braucht es die Leserolle

Ergebnis: Die Zeilen-Ebene prüft hier nur beim Zurücklesen. Bei Benutzer-Modellen setzt CDMS den Besitzer selbst, siehe Eigene Daten.

Fallen

Wie es weitergeht

Quellen im Code und in der Wissensdatenbank
  • CDMS/cdms-authorization – AbstractAuthorizationLayer (classAccess, accessGrantedByField)
  • CDMS/cdms-system-layer – AbstractLayer (recursiveRead, recursiveQuery, recursivePrepare, enterField, addSecurityFilters, buildSearchRoot, assertVisibleForWrite), AbstractSystemLayer
  • CIAS/cias-authentication – JwtSessionFilter, TokenParser
  • CDMS/cdms-integrationtest – AbstractRoleDenialTest, AbstractFieldRoleTest, AbstractDataFilterTest
  • documentation/40-sicherheit
Suchen