CodamAIDocs
Themafertig

Rechte auf Beziehungen (Feldrollen)

Eine Feldrolle an einer Beziehung erlaubt, ein Kindmodell über genau ein Feld zu lesen oder zu schreiben, ohne direkten Zugang zum Kindmodell. An einfachen Feldern wirkt eine Rolle anders: als zusätzliche Bedingung.

Ausprägungen
Feldrolle statt Klassenrollenur über dieses Feldkein direkter Endpunktnur eine Stufe, nur diese Operationan einfachen Feldern: zusätzliche Bedingung

Worum es geht

Stell dir einen Tresor vault mit Notizen note vor. Eine Person soll die Notizen eines Tresors sehen, wenn sie den Tresor liest. Sie soll aber nicht über /note/query alle Notizen durchsuchen können.

Mit Modellrollen allein geht das nicht: Die Leserolle von note öffnet immer auch den eigenen Endpunkt von note. Dafür gibt es Feldrollen. Eine Feldrolle hängt an einer Beziehung, hier am Feld vault.notes, und heißt z. B. vault-notes-read.

Zwei Wege zum selben Kind

flowchart LR
    P(["Person mit vault-read<br/>und vault-notes-read"])
    P -->|"POST /vault/read/{id}<br/>response: notes"| V["vault"]
    V -->|"über das Feld notes:<br/>vault-notes-read genügt"| N["note"]
    P -.->|"POST /note/query<br/>verlangt note-read"| X["403"]
WegWas CDMS prüftErgebnis mit vault-read und vault-notes-read
über den Tresor: POST /vault/read/{id} mit notes in der responseRolle von vault, dann Feldrolle oder Leserolle von note200 mit Notizen
direkt: POST /note/queryLeserolle von note403 `missing-permission

Wann die Feldrolle zählt

Steigt eine Anfrage über eine Beziehung in ein anderes Modell hinab, prüft CDMS zwei Dinge. Eines davon genügt:

Darf die Anfrage über vault.notes auf note zugreifen?
Feldrolle an vault.notes für diese OperationRolle von note für diese OperationErgebnis
ja–erlaubt über das Feld
neinjaerlaubt über die Rolle des Kindmodells
neinnein403 missing-permission|vault-notes-<operation>
am Feld keine Feldrolle festgelegtnein403 missing-permission|<rolle von note>

Die Operation muss genau passen:

Operation am KindFeldrolle
lesen, auch Listen in der response…-read
mitanlegen…-create
mitändern, per PUT oder PATCH…-update
mitlöschen in einer Kaskade…-delete

Varianten

Feldrollen bei den Operationen

Wann: response nennt notes

  1. 1
    CDMS
    prüft die Leserolle von vault und liest den Tresor
  2. 2
    CDMS
    vault-notes-read vorhanden → liest die Notizen ohne note-read
  3. 3
    CDMS→Database
    liest nur Notizen, die die Filter von note durchlassen

Ergebnis: Die Filter der Zeilen-Ebene gelten weiter. Eine Feldrolle macht keine unsichtbare Notiz sichtbar.

Wann: POST /vault/create mit neuen Notizen in notes

  1. 1
    CDMS
    prüft die Anlegerolle von vault
  2. 2
    CDMS
    vault-notes-create vorhanden → legt die Notizen ohne note-create an
  3. 3
    CDMS
    liest das Ergebnis zurück. Nennt die response die Notizen, gilt wie beim Lesen vault-notes-read oder note-read

Ergebnis: Wer nur vault-notes-create hat, lässt die Notizen aus der response weg, sonst scheitert das Zurücklesen. Siehe Anlegen und Zurücklesen: STRICT oder LENIENT.

Wann: DELETE /vault/delete/{id}, notes mit DELETE-Flag

  1. 1
    CDMS
    prüft die Löschrolle von vault
  2. 2
    CDMS
    vault-notes-delete vorhanden → löscht die Notizen ohne note-delete
  3. 3
    CDMS
    hat eine Notiz selbst abhängige Kinder, braucht jedes davon wieder seine eigene Rolle oder eine Feldrolle an der Beziehung der Notiz

Ergebnis: Siehe Abhängige Objekte (Kaskaden).

Wie weit eine Feldrolle reicht

  • Nur eine Stufe. vault-notes-read gilt für die Notizen, nicht für das, was an einer Notiz hängt. Für die nächste Stufe brauchst du wieder die Rolle des Modells oder eine Feldrolle an der Beziehung der Notiz.
  • Nur diese Operation. vault-notes-read erlaubt kein Mitändern. Dafür brauchst du vault-notes-update oder note-update.
  • An einfachen Feldern anders. Eine Rolle an einem einfachen Feld wie note.text öffnet keinen Weg, sie schützt den Wert zusätzlich zur Rolle des Modells. Siehe Geschützte Werte.
  • Nie der direkte Weg. Auch mit allen vier vault-notes-…-Rollen liefert jeder Endpunkt unter /note/… 403 mit der Rolle von note.

Wo du Feldrollen festlegst

Im Hub markierst du an der Beziehung die Operationen, für die es eine Feldrolle geben soll. Den Namen bildet der Generator: Basisrolle des Modells, Feldname, Operation. Siehe Wie Rollennamen entstehen.

Fallen

Wie es weitergeht

Quellen im Code und in der Wissensdatenbank
  • CDMS/cdms-authorization – AbstractAuthorizationLayer (accessGrantedByField, fieldRole)
  • CDMS/cdms-system-layer – AbstractLayer (enterField, grantedByField, fetchAndSetModel, fetchAndSetList, recursiveDelete), FieldAccessContext
  • CDMS/cdms-generator – CdmsYamlLoader (Feldrollen), DtoMetaProcessor, RoleRegistryProcessor
  • CDMS/cdms-integrationtest – AbstractFieldRoleTest (u. a. theFieldRoleDoesNotOpenTheChildsOwnApi)
  • CDMS/cdms-generator/docs/adr – ADR-011
Suchen