CodamAIDocs
Themafertig

Attributfilter

Ein Attribut der Person (z. B. projects) schränkt ein Datenfeld ein. Wie EQ/IN entsteht, was * bedeutet, was bei fehlendem Attribut passiert und was für Personen mit mehreren Mandanten gilt.

Ausprägungen
ein Wert → EQmehrere Werte → IN* → unbeschränktfehlt/leer → 422Feld über eine Beziehungmehrere Attributfilter an einem ModellPerson mit mehreren Mandanten

Worum es geht

Ein Attributfilter zeigt einer Person nur die Zeilen, die zu einem Wert aus ihrem Profil passen. Beispiel: Aufträge order haben ein Feld companyId. Im Profil einer Sachbearbeiterin steht das Attribut company mit den Firmen, für die sie zuständig ist. Der Attributfilter verbindet beides: Sie sieht nur Aufträge dieser Firmen.

Ein Attribut ist ein benannter Wert im Profil einer Person, etwa company, region oder projects. CIAS legt die Attribute ins Token, CDMS liest sie bei jeder Anfrage aus.

Vom Attribut zur Bedingung

  1. 1
    CIAS
    legt die Attribute der Person in die Anfrage, z. B. company: ["123456", "654321"]
  2. 2
    CDMS
    liest das Attribut company aus
  3. 3
    CDMS
    zerlegt die Werte an Kommas, entfernt Leerzeichen, leere Einträge und Doppelte
  4. 4
    CDMS
    baut die Bedingung für das Feld companyId
    Ein Wert → companyId = 123456. Mehrere Werte → companyId IN (123456, 654321). Enthält die Liste * → gar keine Bedingung.
  5. 5
    CDMS→Database
    verbindet die Bedingung mit UND mit deiner Anfrage
    Ergebnis: Nur Aufträge der eigenen Firmen kommen zurück.

Entscheidungstabelle

Attribut company → Bedingung auf companyId
Attribut company im ProfilErgebnis
"123456"companyId = 123456
"123456", "654321"companyId IN (123456, 654321)
"123456,654321" (ein Eintrag mit Komma)companyId IN (123456, 654321), wie oben
enthält irgendwo "*"keine Bedingung, alle Aufträge
fehlt ganz oder ist eine leere Liste422 missing-attribute-on-profile|company
vorhanden, aber ohne brauchbaren Wert, z. B. "" oder ","422 empty-attribute-on-profile|company

Ein einziges * hebt den Filter ganz auf, auch wenn daneben noch andere Werte stehen.

Wo du einen Attributfilter festlegst

Im Hub verbindest du im Reiter Filter ein Profilattribut mit einem Feld des Modells. Der Generator erzeugt daraus eine Filterklasse, z. B. OrderCompanyIdFilter. Du musst nichts programmieren. Siehe Modellieren im Hub.

Was du als Feld wählen kannst

Wann: Das Modell hat selbst ein Feld mit dem Wert, z. B. companyId.

Die Bedingung prüft genau dieses Feld.

Ergebnis: companyId IN (…)

Wann: Das Modell zeigt über eine Beziehung auf das Objekt, z. B. company.

Der Filter prüft die id des Ziels. Im Profil stehen dann die IDs der Firmen.

Ergebnis: company.id IN (…)

Wann: Am Modell hängen zwei Attributfilter, z. B. company und region.

Beide Bedingungen gelten gleichzeitig, verbunden mit UND. Fehlt eines der Attribute, scheitert die Anfrage mit 422.

Ergebnis: Nur Zeilen, die zu beiden Attributen passen.

Wann: Der Filter hängt an einem abstrakten Modell.

Jeder Untertyp übernimmt ihn.

Ergebnis: Privat- und Firmenkunden sind gleich gefiltert.

Wo der Filter wirkt

Der Attributfilter läuft überall mit, wo CDMS Zeilen des Modells liest:

AnfrageWirkung
POST /queryNur passende Zeilen in data; totalCount zählt nur sie.
POST /read/{id}Nicht passende Zeile → 404 not-found.
Listen und Referenzen in einer responseNicht passende Einträge fehlen; eine nicht passende Einzelreferenz ist null.
PUT, PATCH, DELETE, rollbackCDMS prüft vorher mit demselben Filter: nicht passend → 404.

Siehe Warum Unsichtbares 404 liefert.

Personen mit mehreren Mandanten

Ein Attribut kann für die Person überall gleich sein oder je Mandant einen eigenen Wert haben. Arbeitet eine Person in Mandant A, gilt ihr Wert für A. Arbeitet sie in Mandant B, gilt der Wert für B. Ein Wert je Mandant ersetzt dabei den allgemeinen Wert, er wird nicht dazugezählt. Ist für den aktiven Mandanten ein leerer Wert hinterlegt, scheitert die Anfrage mit 422. Siehe Ein Wert pro Person oder pro Mandant.

Fallen

Wie es weitergeht

Quellen im Code und in der Wissensdatenbank
  • CDMS/cdms-authorization – AbstractAttributeFilter, AttributeValidationException
  • CDMS/cdms-generator – CdmsYamlLoader (accessByAttribute, accessFilters), AttributeFilterProcessor
  • CDMS/cdms-system-layer – AbstractLayer (addSecurityFilters, getCdmsFilter, buildSearchRoot, assertVisibleForWrite)
  • CDMS/cdms-persistence-database – DatabaseConditionBuilder (Pflichtfilter)
  • CIAS/cias-authentication – TokenParser, EffectiveAttributes
  • CDMS/cdms-authorization – AbstractAttributeFilterTest; CDMS/cdms-integrationtest – AbstractDataFilterTest, OrderFilter, VaultFilter
  • documentation/40-sicherheit/03-attributbasierte-filter.md
Suchen