CodamAIDocs
Themafertig

Eigene Logik: Hooks und Events

Hooks laufen im Vorgang und dürfen ablehnen, Events folgen danach. Alle Hook-Punkte und was ein Hook nicht darf.

Ausprägungen
Hook lehnt ab → 422Hook ändert MandantHook ändert StartrollenHook bei FROM_CALLER (nicht aufgerufen)Events

Worum es geht

Jedes Projekt hat eigene Regeln für die Registrierung: Nur Adressen bestimmter Firmen zulassen, den Mandanten nach der Domain wählen, einer Person zusätzliche Rollen geben. Damit dafür niemand den Code von CIAS ändern muss, gibt es zwei Arten von Einhängepunkten:

  • Ein Hook läuft im Vorgang. Er darf Werte ändern oder den Vorgang ablehnen.
  • Ein Event wird danach verschickt. Wer es empfängt, erfährt, was passiert ist, kann es aber nicht mehr ändern.
Hook
im Vorgang
  • Bean, die RegistrationHook umsetzt
  • darf ablehnen (RegistrationRejectedException → 422)
  • darf Mandant, Startrollen, Mail ändern
  • Reihenfolge über getOrder(), kleiner zuerst
Event
danach
  • Spring-@EventListener auf RegistrationEvent
  • kann nichts mehr verhindern
  • enthält nie ein Token
  • wird direkt nach dem Speichern verschickt

Die Hook-Punkte auf der Zeitachse

Wo sich ein Hook einhängen kann
  1. 1
    Hook
    onResolveTenant(context, decision) – Mandant ändern, nicht bei FROM_CALLER
  2. 2
    Hook
    beforeValidation(context) – vor der Prüfung der Felder
  3. 3
    CIAS
    prüft die Felder
  4. 4
    Hook
    afterValidation(context) – der übliche Ort für ein Veto
  5. 5
    Hook
    beforeIdentityProvisioning / afterIdentityProvisioning – nur bei neuem Konto, um das Anlegen in Keycloak
  6. 6
    Hook
    beforeNotification(mail, context) – vor jeder Mail, darf die Mail ändern
  7. 7
    Benutzer→CIAS
    klickt den Link
  8. 8
    Hook
    onVerified(context) – nach der Bestätigung
  9. 9
    Hook
    onAssignInitialRoles(context, roles) – Startrollen ändern
  10. 10
    Hook
    onCompleted(context) – am Ende der Bereitstellung
  11. 11
    Hook
    onFailed(context, error) – wenn die Bereitstellung scheitert
  12. 12
    Hook
    onCompensate(context, accountRemoved) – wenn ein Administrator den gescheiterten Vorgang verwirft; in umgekehrter Reihenfolge, bevor CIAS Mandant, Organisation und Konto zurückbaut

Alle Methoden haben eine leere Standardumsetzung. Ein Hook setzt nur die um, die er braucht.

Die Varianten

Was ein Hook tun kann

Wann: Nur Adressen von Partnerfirmen sollen sich registrieren dürfen.

Der Hook wirft in afterValidation eine RegistrationRejectedException mit eigenem Schlüssel. CIAS legt dann kein Konto an und speichert nichts.

Ergebnis: 422 { "error": "<eigener Schlüssel>", "message": "the registration was refused" }

Wann: Adressen mit @nordbau.example sollen immer in nordbau landen.

onResolveTenant gibt eine neue TenantDecision zurück, etwa JOIN_EXISTING mit Schlüssel nordbau, und einen Grund. null heißt: unverändert. Mehrere Hooks laufen der Reihe nach, jeder sieht das Ergebnis des vorigen.

Ergebnis: Siehe Woher der Mandant kommt.

Wann: Personen einer bestimmten Firma sollen zusätzlich report-read bekommen.

onAssignInitialRoles bekommt die Rollen aus dem Regelwerk und gibt eine neue Menge zurück. CIAS prüft danach, dass es jede Rolle gibt.

Ergebnis: Siehe Startrollen als Regelwerk.

Wann: Einladung durch eine Mandanten-Administratorin.

onResolveTenant wird gar nicht aufgerufen. Der Mandant aus dem Token der Einladenden lässt sich nicht umlenken.

Wann: Ein Datensatz in einem anderen System soll angelegt werden.

onCompleted läuft noch in der Bereitstellung. Wirft er eine Ausnahme, endet der Vorgang in FAILED, und retry führt ihn erneut aus. Soll ein Fehler dort die Registrierung nicht aufhalten, ist ein Event der bessere Ort.

Die Events

Eventwird verschickt, wenn
Initiated(id, flow)eine Registrierung angenommen und die Mail verschickt ist
Verified(id)die Adresse bestätigt ist, per Klick oder von Hand
Completed(id, externalUserId, tenantKey)die Bereitstellung fertig ist
Rejected(id, reason)ein Administrator abgelehnt hat
Failed(id, reason)die Bereitstellung gescheitert ist
Expired(id, state, identityRemoved)ein Vorgang verfallen, ersetzt oder verworfen ist

Events werden im selben Thread verschickt, direkt nachdem CIAS den neuen Zustand gespeichert hat. Ein Listener, der lange braucht, verzögert die Antwort. Das Audit von CIAS hört auf dieselben Events, siehe Eine Spur für alles.

Weiter

Quellen im Code und in der Wissensdatenbank
  • CIAS/cias-registration – RegistrationHook, RegistrationContext, RegistrationEvent, RegistrationRejectedException, RegistrationService (forEachHook, register, verify, provision)
  • CIAS/cias-spring-boot-starter – RegistrationUserHook, RegistrationDefaultGroupHook
  • hub-backend – AccessAttributeRegistrationHook
  • CIAS/cias-registration/docs/adr – ADR-013
Suchen