CodamAIDocs
Themafertig

Gruppen und Mitglieder verwalten

Anlegen, ändern, löschen, Mitglieder aufnehmen und entfernen, bestehende Keycloak-Gruppen übernehmen.

Ausprägungen
anlegenändernlöschenMitglied aufnehmenMitglied entfernenimportieren

Worum es geht

Gruppen verwaltest du über die Verwaltungs-API unter /cias/admin/groups. Die Oberflächen dafür rufen genau diese Aufrufe auf, siehe Die Verwaltungsoberfläche.

Die Aufrufe

AufrufTut
GET /cias/admin/groups?query=…&page=0&size=50eine Seite Gruppen, sortiert nach Schlüssel. query sucht in Schlüssel, Name und Beschreibung
GET /cias/admin/groups/{key}eine Gruppe
POST /cias/admin/groupsGruppe anlegen
PUT /cias/admin/groups/{key}Name, Beschreibung, Rollen und Standardgruppe ändern
DELETE /cias/admin/groups/{key}Gruppe löschen
GET /cias/admin/groups/{key}/members?page=0&size=50eine Seite Mitglieder, als IDs der Benutzerdatensätze
POST /cias/admin/groups/{key}/membersMitglieder aufnehmen
POST /cias/admin/groups/{key}/members/removeMitglieder entfernen
GET /cias/admin/groups/of-user/{userId}alle Gruppen einer Person, ohne Seiten
POST /cias/admin/groups/importbestehende Keycloak-Gruppen übernehmen
POST /cias/admin/groups/reconcileAbgleich mit Keycloak starten, siehe Abgleich mit Keycloak

Listen kommen immer in Seiten: items, page, size, total, hasMore. Ohne Angabe sind es 50 Zeilen, höchstens 500. Wer mehr verlangt, bekommt 400 statt still weniger Zeilen.

Die Prüfungen

Darf dieser Aufruf die Gruppe ändern?
  1. CIAS
    Plattform-Administrator
    Ist der Aufrufer angemeldet, und trägt sein Token eine Rolle, die als Plattform-Administrator zählt?
    ↳ nein 403 cias.authorization.denied, Text not permitted
  2. CIAS
    Gruppe
    Gibt es die Gruppe (bei allem außer Anlegen)? Ist der Schlüssel noch frei (beim Anlegen)?
    ↳ nein 404 cias.authorization.group-not-found bzw. 409 cias.authorization.group-key-in-use
  3. CIAS
    Rollen
    Steht jede genannte Rolle im Katalog?
    ↳ nein 404 cias.authorization.role-not-found
  4. CIAS
    Keycloak
    Beim Nehmen: Hat Keycloak die Änderung angenommen?
    ↳ nein 503, CIAS bleibt unverändert
  5. Änderung gespeichert

Die 403 sieht genauso aus wie jede andere Ablehnung der Rechteprüfung. Den genauen Grund schreibt CIAS ins Log.

Eine Gruppe anlegen

Anfrage
POST /cias/admin/groups
Authorization: Bearer <Token eines Plattform-Administrators>
{
  "key": "support",
  "name": "Support 1st Level",
  "description": "Alle im telefonischen Support",
  "roles": [
    { "client": null, "key": "user" },
    { "client": "cdms-backend", "key": "customer-read" },
    { "client": "crms-backend", "key": "ticket-edit" }
  ],
  "defaultGroup": false
}
Antwort
HTTP 200
{
  "key": "support",
  "name": "Support 1st Level",
  "description": "Alle im telefonischen Support",
  "roles": [
    { "client": null, "key": "user", "displayName": "Benutzer",
      "scope": "PLATFORM", "effectiveInEveryTenant": true },
    { "client": "cdms-backend", "key": "customer-read", "displayName": "Kunden lesen",
      "scope": "PLATFORM", "effectiveInEveryTenant": false },
    { "client": "crms-backend", "key": "ticket-edit", "displayName": "Tickets bearbeiten",
      "scope": "TENANT", "effectiveInEveryTenant": false }
  ],
  "memberCount": 0,
  "defaultGroup": false,
  "syncState": "SYNCHRONIZED"
}
FeldBedeutung
keyPflicht. Fest für immer, in Keycloak der Name der Gruppe
nameoptional, sonst der Schlüssel
rolesdie vollständige Liste. client: null ist eine Realm-Rolle. Fehlt die Liste, trägt die Gruppe keine Rollen
defaultGroupfehlt es, ist es false. Ein Client, der das Feld nicht kennt, macht so nie aus Versehen eine Standardgruppe
effectiveInEveryTenanttrue nur bei Realm-Rollen. false heißt: Diese Rolle fällt unter einem Mandanten mit eigenen Rollen weg, siehe Gruppenrollen unter dynamischen Mandanten
syncStateSYNCHRONIZED, wenn die Kopie in Keycloak steht, sonst PENDING

Eine frisch angelegte Gruppe hat noch keine Mitglieder. Sie gibt also noch niemandem etwas.

Die sechs Ausprägungen

Was du mit einer Gruppe tun kannst

Wann: POST /cias/admin/groups

  1. 1
    CIAS
    prüft Schlüssel und Rollen, speichert die Gruppe als PENDING
  2. 2
    CIAS→Keycloak
    legt die Gruppe im Realm an, markiert mit cias-managed=true, setzt Rollen und Standardgruppe
  3. 3
    CIAS
    merkt sich die Keycloak-ID, setzt SYNCHRONIZED
    Ergebnis: 200 mit der Gruppe. Ist Keycloak nicht erreichbar, trotzdem 200, aber syncState: PENDING

Wann: PUT /cias/admin/groups/{key}, Pfad und key im Body müssen gleich sein, sonst 400

  1. 1
    CIAS→Keycloak
    nimmt zuerst weg: Rollen, die nicht mehr dabei sind, und ggf. die Eigenschaft Standardgruppe
  2. 2
    CIAS
    speichert Name, Beschreibung, Rollen, Standardgruppe, setzt PENDING
  3. 3
    CIAS→Keycloak
    gibt dann dazu: neue Rollen, ggf. Standardgruppe; setzt SYNCHRONIZED
    Ergebnis: 200. Scheitert der erste Keycloak-Schritt: 503, nichts geändert. Scheitert der letzte: 200 mit PENDING

Wann: DELETE /cias/admin/groups/{key}

  1. 1
    CIAS→Keycloak
    löscht die Kopie der Gruppe
  2. 2
    CIAS
    löscht Gruppe und Mitgliedschaften
    Ergebnis: 204. Die Mitglieder behalten ihre Konten und verlieren nur, was die Gruppe gab. Scheitert Keycloak: 503, die Gruppe bleibt

Wann: POST …/members mit { "userIds": ["5c9e…", "7a1b…"] }

  1. 1
    CIAS
    speichert die Mitgliedschaften; wer schon Mitglied ist, bleibt es einfach
  2. 2
    CIAS→Keycloak
    nimmt jede Person in die Kopie der Gruppe auf
    Ergebnis: 200 mit der Gruppe. Klappt Keycloak nicht für alle: trotzdem 200, aber PENDING

Wann: POST …/members/remove mit { "userIds": ["5c9e…"] }

  1. 1
    CIAS→Keycloak
    nimmt jede Person aus der Kopie der Gruppe
  2. 2
    CIAS
    löscht die Mitgliedschaften
    Ergebnis: 200. Scheitert Keycloak: 503, CIAS bleibt unverändert

Wann: POST /cias/admin/groups/import, ohne Body

Übernimmt die Gruppen, die es in Keycloak schon gibt und die CIAS noch nicht führt. Details im nächsten Abschnitt.

Ergebnis: 200 mit einem Bericht

Rollen ändern heißt: die ganze Liste schicken

Es gibt kein „Rolle hinzufügen“ und kein „Rolle entfernen“. Du schickst beim PUT immer die vollständige Liste. Eine Rolle entfernst du, indem du die Liste ohne sie schickst. Was du weglässt, fällt weg, auch in Keycloak, auch wenn es die letzte Rolle eines Moduls war.

Der Schlüssel lässt sich nicht ändern. Soll eine Gruppe anders heißen, änderst du name.

Mitglieder sind Benutzerdatensätze

userIds sind die IDs der Benutzerdatensätze in CIAS, nicht die Keycloak-sub. Wie du sie findest, steht unter Der Benutzerdatensatz. Die Liste darf nicht leer sein, sonst 400. Du kannst mehrere Personen auf einmal aufnehmen oder entfernen, wie beim Ankreuzen in einer Oberfläche.

Bestehende Keycloak-Gruppen übernehmen

Ein Realm, den es schon vor CIAS gab, enthält oft Gruppen, die jemand in der Keycloak-Konsole angelegt hat. Sie tragen keine Marke cias-managed, also fasst CIAS sie nicht an. Mit dem Import übernimmt CIAS sie.

Was der Import mit jeder Gruppe tut
  1. 1
    CIAS→Keycloak
    liest alle Gruppen der obersten Ebene ohne Marke cias-managed. Gruppen, die Keycloak selbst führt (Attribute mit kc., etwa Organisationsgruppen), bleiben außen vor
  2. 2
    CIAS
    Führt CIAS schon eine Gruppe mit diesem Schlüssel? Dann bleibt sie unangetastet
  3. 3
    CIAS
    Stehen alle Rollen der Gruppe im Katalog? Hat jedes Mitglied einen Benutzerdatensatz in CIAS?
  4. 4
    CIAS
    nein → Gruppe wird übersprungen, mit Grund im Bericht
  5. 5
    CIAS
    speichert die Gruppe mit Rollen, Mitgliedern und Standardgruppe, genau wie in Keycloak
  6. 6
    CIAS→Keycloak
    setzt die Marke cias-managed=true, sonst nichts
    Ergebnis: Die Gruppe gehört jetzt CIAS. Rollen und Mitglieder sind unverändert
Anfrage
POST /cias/admin/groups/import
Antwort
HTTP 200
{
  "found": 4,
  "adopted": 2,
  "alreadyKnown": 1,
  "skipped": [
    { "group": "buchhaltung",
      "reason": "it carries 1 role(s) the CIAS catalogue does not know (erp:invoice-approve) — their module has to declare them first, or the next reconciliation would take them off the group" }
  ]
}

Eine Gruppe wird ganz oder gar nicht übernommen. Warum so streng? Was CIAS führt, schreibt der Abgleich später nach Keycloak zurück. Würde CIAS eine unbekannte Rolle einfach weglassen, nähme der nächste Abgleich sie der Gruppe weg. Würde CIAS ein unbekanntes Mitglied weglassen, flöge die Person aus der Gruppe. Deshalb: erst fehlende Rollen vom Modul anmelden lassen und fehlende Konten übernehmen, dann den Import wiederholen.

Der Import lässt sich gefahrlos wiederholen. Übernommene Gruppen tragen die Marke und tauchen beim nächsten Lauf nicht mehr auf. Ein unterbrochener Lauf wird beim nächsten Mal zu Ende gebracht. Unter alreadyKnown zählen Keycloak-Gruppen ohne Marke, deren Namen CIAS schon für eine eigene Gruppe führt. Sie bleiben unangetastet. Untergruppen übernimmt der Import nicht, nur die oberste Ebene.

Fehler auf einen Blick

AntwortWann
400 cias.authorization.invalid-requestkey fehlt, userIds leer, Pfad und Body nennen verschiedene Gruppen, Leerzeichen in einem Rollennamen, Seite zu groß
403 cias.authorization.deniedkein Plattform-Administrator
404 cias.authorization.group-not-foundGruppe unbekannt. GET /cias/admin/groups/{key} antwortet 404 ohne Body
404 cias.authorization.role-not-foundeine Rolle steht nicht im Katalog
409 cias.authorization.group-key-in-useder Schlüssel ist schon vergeben
503Keycloak nicht erreichbar, beim Nehmen

Fallen

Weiter

Quellen im Code und in der Wissensdatenbank
  • CIAS/cias-authorization – GroupAdminController (/cias/admin/groups), AuthorizationRestDtos (GroupRequest, GroupRoleRequest, MembersRequest, GroupResponse, GroupRoleResponse, PageResponse), AuthorizationExceptionHandler
  • CIAS/cias-authorization – GroupService (create, update, restrict, delete, addMembers, removeMembers, members, groupsOf), GroupProjection (push, remove, addMember, removeMember), DefineGroupCommand
  • CIAS/cias-authorization – GroupImportService, GroupImportReport
  • CIAS/cias-iam-keycloak – KeycloakGroupAdapter (listAdoptable, adopt)
  • CIAS/cias-kernel – Page (DEFAULT_SIZE 50, MAX_SIZE 500)
  • CIAS/cias-authorization/docs/adr – ADR-017, ADR-034
Suchen