CodamAIDocs
Themafertig

Statische und dynamische Mandanten

Ein statischer Mandant hängt an einem Benutzerattribut, ein dynamischer an einer Keycloak-Organisation. Wann welcher passt.

Ausprägungen
STATICDYNAMIC

Worum es geht

Jeder Mandant in CIAS hat eine Art, im Code TenantType. Sie sagt nicht, was der Mandant fachlich ist. Ein Kunde ist ein Kunde, egal welche Art er hat. Die Art sagt nur, wie Keycloak den Mandanten kennt und damit, wie er ins Token kommt:

  • STATIC: Keycloak kennt den Mandanten gar nicht. Die Person trägt ihn als Benutzerattribut tenant an ihrem Konto.
  • DYNAMIC: Keycloak führt den Mandanten als Organisation. Die Person ist Mitglied dieser Organisation.

Die beiden Arten nebeneinander

STATIC und DYNAMIC
STATICDYNAMIC
In KeycloaknichtsOrganisation, ihr Alias ist der Mandantenschlüssel
Wie eine Person dazugehörtAttribut tenant am KontoMitgliedschaft in der Organisation
Wo er im Token stehtClaim tenantClaim organization
Mandanten je Personeiner, dazu Ziele für den Wechsel in allowedTenantsbeliebig viele Mitgliedschaften
Eigene Rollen im Mandantennein, die Rollen des Tokens geltenja, Rollen je Organisation
Feld am CIAS-DatensatzexternalOrganizationId leerexternalOrganizationId = ID der Organisation
Typischer Einsatzwenige, fest eingerichtete Kunden; bestehende InstallationenSelbstregistrierung von Firmen, Personen in mehreren Firmen

Der Alias einer Organisation ist ihr Kurzname in Keycloak, zum Beispiel nordbau. CIAS legt Organisationen immer so an, dass der Alias gleich dem Mandantenschlüssel ist. Deshalb kann die Filterkette aus dem Token direkt den Mandanten ablesen.

So sieht es im Token aus

Anfrage
STATIC – Anna gehört fest zum Mandanten stadtwerke-nord

{
  "sub": "3f2a…",
  "tenant": "stadtwerke-nord",
  "allowedTenants": ["stadtwerke-nord"],
  "resource_access": { "cdms": { "roles": ["customer-read"] } }
}
Antwort
DYNAMIC – Ben ist Mitglied der Organisation nordbau

{
  "sub": "8c1d…",
  "tenant": "nordbau",
  "allowedTenants": ["nordbau"],
  "organization": {
    "nordbau": {
      "id": "b7e0…",
      "resource_access": { "cdms": { "roles": ["order-edit"] } }
    }
  }
}

Beim dynamischen Mandanten steht der Schlüssel zweimal im Token: als Organisation und im Attribut tenant. Das ist Absicht. Wenn CIAS eine Person einem Mandanten zuordnet, schreibt es tenant und allowedTenants immer, auch bei einer Organisation. Beide Werte sind gleich und können sich deshalb nicht widersprechen. Würde das Attribut einen anderen Mandanten nennen als die Organisationen, lehnte die Filterkette die Anfrage ab, siehe Den Mandanten einer Anfrage bestimmen.

Rollen je Art

Welche Rollen im Mandanten gelten

Wann: Anna arbeitet im statischen Mandanten stadtwerke-nord.

Es gelten die Client-Rollen aus resource_access und die Realm-Rollen. Jede Rolle, die Anna hat, gilt in ihrem Mandanten. Ein zweiter Mandant mit anderen Rollen ist nicht möglich.

Ergebnis: Einfach und vorhersehbar: eine Person, ein Mandant, ein Satz Rollen.

Wann: Ben arbeitet im dynamischen Mandanten nordbau.

Trägt die Organisation eigene Rollen, ersetzen diese die globalen Client-Rollen. Trägt sie keine, gelten die globalen Client-Rollen. Realm-Rollen gelten immer und werden von keiner Organisation erweitert.

Ergebnis: Ben kann in nordbau Bearbeiter sein und in einer zweiten Organisation nur Leser.

Wie die effektiven Rollen genau entstehen, steht unter Effektive Rollen: global oder im Mandanten.

Wie ein Mandant zu seiner Art kommt

Die Art wird beim Anlegen festgelegt und ändert sich danach nicht.

WegArtWas in Keycloak passiert
Selbstregistrierung einer Firma (CREATE_NEW)immer DYNAMICCIAS legt die Organisation an, der Alias ist der neue Schlüssel
Verwaltungs-API POST /cias/admin/tenantsmuss im Aufruf stehen, es gibt keinen Standardnichts; bei DYNAMIC nennt der Aufruf die ID einer Organisation, die es schon gibt
Erster Mandant beim Start (Bootstrap)aus der Konfigurationnichts

Warum die Verwaltungs-API keinen Standard kennt: Ein dynamischer Mandant ohne Organisation lässt sich aus keinem Token bestimmen, und ein statischer Mandant, zu dem es doch eine Organisation gibt, würde aus dem falschen Grund aufgelöst. Also muss der Aufruf sagen, welche Art gemeint ist. Mehr unter Einen Mandanten anlegen und bereitstellen.

Welche Art passt?

STATIC oder DYNAMIC?
Personen gehören zu mehreren Firmen?Rollen sollen je Firma verschieden sein?Firmen registrieren sich selbst?Empfehlung
ja––DYNAMIC
–ja–DYNAMIC
––jaDYNAMIC, die Selbstregistrierung legt ohnehin nur solche an
neinneinneinSTATIC genügt; eine Person, ein Mandant, die Rollen aus dem Token

Beide Arten dürfen in einer Installation nebeneinander vorkommen. Die Art steht am Mandanten, nicht an der Installation.

Fallen

Weiter

Quellen im Code und in der Wissensdatenbank
  • CIAS/cias-kernel – TenantType (STATIC, DYNAMIC), TenantContext (ofStatic, ofOrganization)
  • CIAS/cias-tenancy – Tenant (type, externalOrganizationId), V1__cias_tenant.sql (tenant_type)
  • CIAS/cias-authentication – OrganizationTenantResolver, EffectiveRoles, CiasTokenProperties (tenant, allowedTenants, organization)
  • CIAS/cias-registration – RegistrationService.assignTenant (CREATE_NEW legt DYNAMIC an, writeTenantAttributes)
  • CIAS/cias-authentication/docs/adr – ADR-006; CIAS/cias-tenancy/docs/adr – ADR-037
Suchen