CodamAIDocs
Themafertig

Strict Mode: Fehler oder still ignorieren

Ob eine unzulässige Anfrage einen Fehler liefert oder still gekürzt wird. Wo das wirkt und warum strikt der Standard ist.

Ausprägungen
strikt: fehlende Rolle → 403tolerant: Read → 404, Query → 403tolerant: Schreiben → 403 mit eigenem Schlüsseltolerant: Referenz in der response → nullverschachteltes Create strikt/tolerantnur global einstellbar

Worum es geht

Was soll passieren, wenn eine Anfrage etwas verlangt, das nicht erlaubt ist? Es gibt zwei Antworten:

  • Strikt: CDMS lehnt die Anfrage mit einem Fehler ab, der genau sagt, was fehlt.
  • Tolerant: CDMS lässt weg, was nicht erlaubt ist, und liefert den Rest. Wo das nicht geht, kommt ein allgemeinerer Fehler.

Welche Antwort gilt, legt der Strict Mode fest. Er ist standardmäßig an.

Wo er eingestellt wird

Der Strict Mode gilt für eine ganze CDMS-Instanz: für alle Modelle und alle Anfragen. Du stellst ihn über die Umgebungsvariable STRICT_MODE ein. Fehlt sie, gilt true.

Ein Client kann ihn nicht umschalten, und ein einzelnes Modell kann nicht anders eingestellt sein.

Die Matrix

FallStrict Mode anStrict Mode aus
lesen per id, Leserolle fehlt403 missing-permission|<leserolle>404 not-found
suchen, Leserolle fehlt403 missing-permission|<leserolle>403 empty-request-left
Einzelreferenz in der response, Rolle fehlt403 missing-permission|<rolle>Feld ist null, kein Fehler
Liste in der response, Rolle fehlt403 missing-permission|<rolle>403 empty-request-left für die ganze Anfrage
anlegen, Rolle fehlt403 missing-permission|<rolle>403 missing-create-role
ändern (PUT, PATCH), Rolle fehlt403 missing-permission|<rolle>403 missing-update-role
löschen, Rolle fehlt, auch in der Kaskade403 missing-permission|<rolle>403 missing-delete-role
Historie lesen, Rolle fehlt403 missing-permission|<rolle>403 missing-read-role / missing-history-role
Rollback, Rolle fehlt403 missing-permission|<rolle>403 missing-rollback-role
Kind mitanlegen oder mitändern, Rolle und Feldrolle fehlen403 missing-permission|<feldrolle oder rolle>403 missing-create-role / missing-update-role
neues Kind in einer Liste, Beziehung ohne CREATE400 recursive-create-not-allowed|<feld>Eintrag wird übergangen
neues Kind als Einzelreferenz, Beziehung ohne CREATE400 recursive-create-not-allowed|<feld>das Feld wird leer

Die letzten beiden Zeilen betreffen keine Rolle, sondern die Flags der Beziehung. Siehe Die vier Fälle beim verschachtelten Schreiben.

Strikt und tolerant im Vergleich

Was der Client erfährt
Strict Mode an
Standard
  • jede fehlende Rolle → 403
  • der Schlüssel nennt die fehlende Rolle
  • der Client weiß sofort, welche Rolle er braucht
  • gleiche Anfrage, gleiches Ergebnis für jede Person
Strict Mode aus
tolerant
  • Einzelreferenzen ohne Rolle werden null
  • Lesen per id ohne Rolle → 404
  • Schreiben → 403 ohne Rollennamen
  • eine Antwort mit null sieht aus wie ein leeres Feld

Beim Lesen im Einzelnen

POST /hr/employee/read/{id} mit response ["*", { "field": "company" }]
Strict ModeRolle employeeRolle companyAntwort
annein–403 missing-permission|<rolle von employee>
anjanein403 missing-permission|<rolle von company>
ausnein–404 not-found
ausjanein200, company ist null
–jaja200 mit Firma

Warum strikt der Standard ist

  • Fehler fallen auf. Eine fehlende Rolle zeigt sich beim ersten Test, nicht erst, wenn eine Person sich über leere Felder wundert.
  • null bleibt eindeutig. Mit Strict Mode heißt null in einer Antwort: nicht gesetzt oder unsichtbar. Ohne ihn kann es auch heißen: Rolle fehlt.
  • Der Schlüssel hilft. missing-permission|audit-question-read sagt dir genau, welche Rolle du vergeben musst.

Die Filter der Zeilen-Ebene hängen nicht vom Strict Mode ab. Unsichtbare Zeilen liefern immer 404 oder fehlen in der Liste. Siehe Warum Unsichtbares 404 liefert.

Fallen

Wie es weitergeht

Quellen im Code und in der Wissensdatenbank
  • commons – RequestContext (STRICT_MODE)
  • CDMS/cdms-authorization – AbstractAuthorizationLayer.classAccess, MissingPermissionException
  • CDMS/cdms-system-layer – AbstractLayer (recursiveRead, recursiveQuery, recursivePrepare, recursiveDelete, queryHistory, enterField, fetchAndSetModel, fetchAndSetList), AbstractSystemLayer (readObject, queryObjects, historyRollback)
  • CDMS/cdms-integrationtest – AbstractRoleDenialTest, RequestContextTestFilter
  • documentation/40-sicherheit/04-strict-mode.md
Suchen