CodamAIDocs
Themafertig

Zwei Herkünfte von Attributen

Plattformattribute (z. B. tenant) und Projektattribute aus dem Modell. Der Unterschied und warum er wichtig ist.

Ausprägungen
PlattformattributProjektattribut

Worum es geht

Ein Benutzerattribut ist eine benannte Angabe an einer Person, die als Claim ins Token kommt. Ein Claim ist ein Eintrag im Token, etwa "projects": ["alpha", "beta"]. CIAS liest ihn bei jeder Anfrage und legt ihn in den RequestContext. CDMS kann damit Zeilen filtern, siehe Attributfilter.

Kein Attribut entsteht einfach so. Jedes wird von einem Modul angemeldet: Das Modul sagt, welche Angaben es über eine Person braucht. Es gibt zwei Quellen:

Nicht zu verwechseln mit den CIAS-Attributen am Benutzerdatensatz. Das sind Notizen der Fachlichkeit, die nie ins Token kommen, siehe Attribute einer Person pflegen.

Das Bild

flowchart LR
    subgraph P["Plattform"]
      CI["CIAS meldet an:<br/>tenant<br/>allowedTenants<br/>locale"]
    end
    subgraph M["Dein Projekt"]
      MO["Modell mit accessByAttribute<br/>auf dem Feld region"] --> GEN["Generator"]
      GEN --> CD["CDMS meldet an:<br/>region"]
    end
    CI --> K["Attributkatalog in CIAS"]
    CD --> K
    K --> KC["Benutzerprofil in Keycloak<br/>und Claim-Mapper"]
    KC --> T["Token"]

Beide Quellen laufen durch denselben Weg: Anmeldung, Katalog, Keycloak, Token. Wie das im Einzelnen geht, steht unter Attribute anmelden und Der Weg ins Token.

Die Plattformattribute

CIAS meldet genau drei Attribute an:

AttributArtWofürWer ändert es
tenantein Wert, optionalder statische Mandant einer Person, siehe Statische und dynamische Mandantennur Administratoren
allowedTenantsListe, optionalweitere Mandanten, in die die Person wechseln darfnur Administratoren
localeein Wert, Standard dedie Sprache, in der die Person angesprochen wirddie Person selbst, auch in Keycloaks Kontoseite

Die Namen von tenant und allowedTenants lassen sich umstellen, mit codamai.cias.token.claims.tenant-attribute und codamai.cias.token.claims.allowed-tenants-attribute. CIAS meldet sie dann unter dem neuen Namen an und liest sie auch unter diesem Namen aus dem Token. locale heißt immer so: Unter diesem Namen speichert Keycloak die Sprache ohnehin. Den Standardwert stellst du mit codamai.cias.locale.default ein.

Warum darf die Person tenant nicht selbst ändern, locale aber schon? tenant ist eine Aussage der Installation über die Person. Könnte sie sie ändern, setzte sie sich in die Daten eines fremden Kunden. locale ist eine Vorliebe, die der Person gehört. Wäre sie nur für Administratoren änderbar, würde Keycloaks eigener Sprachumschalter mit einem Fehler antworten.

Die Projektattribute

Ein Projektattribut entsteht aus dem Modell. Steht an einem Modell accessByAttribute, verbindet es ein Feld der Daten mit einem Attribut der Person, etwa das Feld region mit dem Attribut region. Der Generator sammelt alle diese Attribute über alle Modelle, jedes nur einmal, und meldet sie für CDMS an.

Jedes so erzeugte Attribut ist:

  • mehrwertig: Die Person kann mehrere Werte haben, etwa nord und west. Der Filter macht daraus ein IN.
  • optional, ohne Standardwert. Fehlt der Wert bei einer Person, lehnt CDMS ihre Anfrage an ein gefiltertes Modell ab, siehe Attributfilter.
  • an die Person gebunden: ein Wert pro Person, in jedem Mandanten derselbe.

Hat dein Projekt kein Modell mit accessByAttribute, meldet CDMS gar kein Attribut an.

Ein Modul, das seine Anmeldung von Hand schreibt, kann mehr sagen: ein Pflichtattribut mit Standardwert, eine Vorliebe, die die Person selbst ändert, oder ein Wert pro Mandant. Siehe Attribute anmelden und Ein Wert pro Person oder pro Mandant.

Der Unterschied auf einen Blick

Plattformattribut
von CIAS
  • steuert Mandant, Mandantenwechsel, Sprache
  • immer da, wo CIAS läuft
  • Name teils einstellbar
  • tenant und allowedTenants nur für Administratoren
Projektattribut
aus dem Modell
  • schneidet Daten zu (Attributfilter)
  • nur, wenn ein Modell accessByAttribute nutzt
  • Name aus dem Modell
  • mehrwertig, optional, an die Person gebunden

Warum der Unterschied wichtig ist

Welches Attribut ist das?
Wer meldet es an?Wofür wird es gelesen?Folgt daraus
CIASMandant, Wechsel, SprachePlattformattribut. Ein falscher Wert führt die Person in einen falschen Mandanten oder sperrt sie aus
CDMS, aus dem ModellAttributfilterProjektattribut. Ein falscher Wert zeigt falsche Zeilen, ohne Fehlermeldung
niemand–kein angemeldetes Attribut. Es kommt nicht zuverlässig ins Token, und über CIAS darf es niemand je Mandant schreiben

Beide Arten sind also Rechte, keine bloßen Daten. Wer einen Wert schreiben darf, bestimmt, was die Person sehen oder erreichen kann. Siehe Wer ein Attribut schreiben darf.

Fallen

Weiter

Quellen im Code und in der Wissensdatenbank
  • commons – IdentityRegistryInterface.attributes(), models.Attribute (optional, required, preference, asMultivalued, perTenant), models.AttributeBinding
  • CIAS/cias-authorization – CiasIdentityRegistry (tenant, allowedTenants, locale), CiasAuthorizationConfiguration (codamai.cias.token.claims.tenant-attribute, allowed-tenants-attribute, codamai.cias.locale.default)
  • CDMS/cdms-generator – RoleRegistryProcessor (getAllAttributesFromContexts, writeRoleRegistry: Attribute.optional(…).asMultivalued())
  • CIAS/cias-authorization – RoleReconciliationService (attributeContradictions)
  • CIAS/cias-authorization/docs/adr – ADR-025, ADR-026, ADR-040; CIAS/cias-authentication/docs/adr – ADR-042
Suchen