CodamAIDocs
Themafertig

Vorlagen bearbeiten

Wer welche Vorlage ändern darf: Editoren (Plattform-Administrator, mail-template-admin) alle, Mandanten-Administratoren nur eigene und nur freigegebene Arten. Standardfassung zurücksetzen statt löschen.

Ausprägungen
EditorMandanten-Administratornicht freigegebene Art → abgelehntfremde Vorlage → abgelehntVorlage lässt sich nicht erzeugen → abgelehntStandardfassung zurücksetzenFassung eines Mandanten löschen

Worum es geht

Alle Vorlagen liegen in der Datenbank: je Mail und Sprache die Standardfassung, dazu die Fassungen einzelner Mandanten. Sie lassen sich zur Laufzeit ändern, ohne neue Auslieferung. Weil eine Mail im Namen der Plattform verschickt wird, ist genau geregelt, wer was ändern darf.

Die Aufrufe

AufrufTut
GET /cias/notification/templatesalle Vorlagen, die du sehen darfst
POST /cias/notification/templateseine Vorlage speichern: anlegen oder ersetzen
POST /cias/notification/templates/{id}/reseteine Standardfassung auf den ausgelieferten Text zurücksetzen
DELETE /cias/notification/templates/{id}die Fassung eines Mandanten löschen. Er bekommt dann wieder die Standardfassung

Ein Editor sieht in der Liste jede Vorlage, ein Mandanten-Administrator nur die Fassungen seines Mandanten. Die Aufrufe gibt es nur, wenn codamai.cias.notification.enabled, persistence: jpa und rest eingeschaltet sind. Sonst antworten sie mit 404, als gäbe es sie nicht.

Eine Vorlage speichern

Anfrage
POST /cias/notification/templates
Authorization: Bearer <Token von Anna, tenant-admin in nordbau>
{
  "key": "WELCOME",
  "locale": "de",
  "subject": "Willkommen bei Nordbau",
  "body": "Guten Tag,\n\nIhr Zugang ist bereit: ${loginUrl}\n\nIhr Nordbau-Team",
  "html": false
}
Antwort
HTTP 200
{
  "id": "7d2c…",
  "key": "WELCOME",
  "tenantKey": "nordbau",
  "locale": "de",
  "subject": "Willkommen bei Nordbau",
  "body": "Guten Tag, …",
  "html": false,
  "updatedBy": "5c9e…",
  "updatedAt": "2026-10-01T10:15:00Z",
  "origin": "EDITED",
  "isDefault": false
}
FeldBedeutung
idfehlt: anlegen, oder die Vorlage mit denselben Merkmalen ersetzen. Gesetzt: genau diese Vorlage ersetzen
keywelche Mail, siehe Welche Mails es gibt
tenantKeyfür welchen Mandanten. Nur ein Editor kann ihn setzen. Leer heißt: die Standardfassung. Bei allen anderen nimmt CIAS den Mandanten aus dem Token und verwirft den Wert
localedie Sprache, etwa de oder en
subject, bodyBetreff und Text, mit Platzhaltern wie ${loginUrl}
htmlob der Text HTML ist. Dann schickt CIAS zusätzlich eine reine Textfassung mit
updatedBy, updatedAtwer zuletzt geändert hat und wann. Die Person kommt aus dem Token. Leer bei einer ausgelieferten Fassung
originPACKAGED, solange es der ausgelieferte Text ist, EDITED, sobald jemand ihn geändert hat
isDefaultob es die Standardfassung ist, also die Vorlage ohne Mandant

Eine Vorlage ist durch Mail, Mandant und Sprache bestimmt. Ohne Mandanten gibt es je Mail und Sprache genau eine: Speichern ohne tenantKey ändert die Standardfassung, es legt nie eine zweite an. Zweimal mit denselben Merkmalen speichern ergibt ebenso eine Vorlage.

Die Prüfung

Darf dieser Aufrufer diese Vorlage speichern?
  1. CIAS
    angemeldet
    Hat die Anfrage ein Token, und nennt es die Person?
    ↳ nein 403 cias.notification.template-forbidden
  2. CIAS
    Editor?
    ja → darf jede Vorlage, der Mandant kommt aus tenantKey
  3. CIAS
    Mandanten-Administrator
    Hat der Aufrufer die Mandanten-Administrator-Rolle, und nennt sein Token einen Mandanten?
    ↳ nein 403 cias.notification.template-forbidden
  4. CIAS
    freigegebene Art
    Steht die Mail auf der Liste, die Mandanten ändern dürfen?
    ↳ nein 422 cias.notification.template-rejected
  5. CIAS
    eigene Vorlage
    Beim Ersetzen per id: Gehört die Vorlage dem eigenen Mandanten, und ist es keine Standardfassung?
    ↳ nein 403 cias.notification.template-forbidden
  6. CIAS
    lässt sich erzeugen
    CIAS erzeugt die Vorlage einmal probeweise, mit leeren Werten für alle Platzhalter. Klappt das?
    ↳ nein 422 cias.notification.template-rejected, mit der ersten Zeile der Fehlermeldung
  7. Vorlage gespeichert

Wer was darf, je Installation

Welche Rollen Editor sind, stellt codamai.cias.notification.editor-roles ein, oder die Umgebungsvariable CIAS_NOTIFICATION_EDITOR_ROLES. Standard ist platform-admin,mail-template-admin. Welche Mails Mandanten ändern dürfen, legt jede Installation fest. Dafür gibt es absichtlich keinen Standard: Eine Installation, die sich die Frage nicht gestellt hat, startet nicht.

InstallationEditorenMandanten-RolleMails, die Mandanten ändern dürfen
eigenständiges CIASaus CIAS_NOTIFICATION_EDITOR_ROLES, Standard platform-admin, mail-template-admintenant-adminMEMBERSHIP_INVITATION, INVITATION, WELCOME
eingebettet im Hub-Backenddie Plattform-Administrator-Rollen der Installation, dazu dieselbe Einstellungtenant-adminkeine

mail-template-admin ist eine Realm-Rolle, siehe Die Realm-Rollen der Plattform. Sie reicht an die Texte aller Mandanten und wird deshalb nie innerhalb eines Mandanten vergeben.

Die Liste für Mandanten ist eine Erlaubnisliste, keine Sperrliste. Neue Mails sind also zunächst für Mandanten gesperrt. Warum gerade diese nicht freigegeben sind:

  • VERIFY_EMAIL und PASSWORD_SETUP tragen einen Link, der ein Konto öffnet. Wer sie umformulieren kann, schreibt eine überzeugende Phishing-Mail vom Absender der Plattform.
  • ALREADY_REGISTERED geht womöglich an jemanden aus einem ganz anderen Mandanten.
  • APPROVAL_PENDING und REJECTED formulieren eine Entscheidung. Wer entscheidet, soll sie nicht nachträglich umschreiben.

Die Ausprägungen

Wer ändert was

Wann: Das Token trägt platform-admin oder mail-template-admin.

Darf jede Vorlage speichern: die Standardfassung (tenantKey leer) oder die Fassung eines beliebigen Mandanten. Ist nicht an die Erlaubnisliste gebunden. Sieht in der Liste alle Vorlagen.

Ergebnis: erlaubt

Wann: Anna ist tenant-admin in nordbau und speichert WELCOME.

CIAS speichert die Vorlage als Fassung von nordbau, egal was in tenantKey steht. Anna sieht in der Liste nur die Fassungen von nordbau.

Ergebnis: erlaubt, wenn WELCOME freigegeben ist

Wann: Anna will VERIFY_EMAIL ändern.

Die Mail steht nicht auf der Erlaubnisliste. Die Antwort nennt den Grund, damit Anna weiß, woran es liegt.

Ergebnis: 422 cias.notification.template-rejected

Wann: Anna schickt die id einer Standardfassung oder der Fassung eines anderen Mandanten.

Standardfassungen ändern nur Editoren.

Ergebnis: 403 cias.notification.template-forbidden

Wann: Im Text steht etwa Hallo ${name ohne schließende Klammer, oder ein gesperrter Befehl wie ?new.

CIAS lehnt das Speichern ab und nennt die Stelle. Gespeichert wird nichts.

Ergebnis: 422 cias.notification.template-rejected

Wann: POST /cias/notification/templates/{id}/reset durch einen Editor

Die Standardfassung bekommt wieder den ausgelieferten Text und gilt als PACKAGED. Mit dem nächsten Release zieht sie also wieder automatisch nach. Für eine Mail, für die CIAS keinen Text ausliefert, gibt es nichts zurückzusetzen.

Ergebnis: 200 mit der Vorlage, oder 422 cias.notification.template-rejected

Wann: DELETE /cias/notification/templates/{id}

Dieselben Regeln wie beim Speichern. Danach bekommt der Mandant wieder die Standardfassung. Eine Standardfassung lässt sich nicht löschen, nur zurücksetzen. Eine Vorlage, die du nicht sehen darfst, gibt es für dich nicht: 404, nicht 403. So lässt sich nicht zählen, welche Vorlagen andere Kunden haben.

Ergebnis: 204, 404 cias.notification.template-not-found, oder 422 bei einer Standardfassung

Was eine Vorlage kann

Vorlagen sind in FreeMarker geschrieben, einer Vorlagensprache. Du kannst Platzhalter einsetzen (${loginUrl}) und einfache Bedingungen schreiben:

<#if passwordUrl?has_content>
Vergeben Sie jetzt Ihr Passwort: ${passwordUrl}
<#else>
Melden Sie sich an: ${loginUrl}
</#if>

Mehr nicht. Weil jemand anderes als die Entwickler Vorlagen schreibt, ist FreeMarker abgeriegelt: Eine Vorlage kann keine Klassen erzeugen, keine Methoden aufrufen und nicht an die Objekte dahinter gelangen. Sie sieht nur die Werte des Kontexts, dazu in jeder Mail ${application} und ${flow}.

Beim Speichern erzeugt CIAS die Vorlage einmal probeweise, mit derselben abgeriegelten Einstellung und mit leeren Werten für alle Platzhalter. Eine Vorlage, die sich so nicht erzeugen lässt, wird abgelehnt. Prüfe trotzdem mit einer echten Mail, ob der Text so ankommt, wie du willst: Platzhalter mit Werten verhalten sich manchmal anders als leere.

Fehler auf einen Blick

AntwortWann
400 cias.notification.invalid-payloadPflichtfeld fehlt, Feld zu lang (Betreff bis 512, Text bis 65535 Zeichen), ungültiger Mail-Schlüssel
403 cias.notification.template-forbiddennicht angemeldet, keine passende Rolle, fremde Vorlage, Mandanten-Administrator will zurücksetzen
404 cias.notification.template-not-foundid unbekannt oder für dich unsichtbar
404 ohne Bodydie Aufrufe sind in dieser Installation ausgeschaltet
422 cias.notification.template-rejectedMandanten dürfen diese Mail nicht ändern, Vorlage lässt sich nicht erzeugen, Standardfassung löschen, nichts zum Zurücksetzen

Fallen

Weiter

Quellen im Code und in der Wissensdatenbank
  • CIAS/cias-notification – MailTemplateAdminController (GET/POST /cias/notification/templates, DELETE /cias/notification/templates/{id}, POST /cias/notification/templates/{id}/reset), MailTemplateRestDtos (SaveTemplateRequest, TemplateResponse), MailTemplateExceptionHandler, NotificationEndpointGuard
  • CIAS/cias-notification – MailTemplateService (list, save, delete, reset, scopeFor, locate, requireWritable), MailTemplateEditPolicy (editorRoles, EDITOR_ROLES), EditorContext, StoredTemplate (origin, isDefault), MailTemplateValidator
  • CIAS/cias-notification – FreeMarkerMailRenderer (lockedDownConfiguration), FreeMarkerTemplateValidator
  • CIAS/cias-runtime – CiasMailTemplateEditConfiguration; hub-backend – CiasRegistrationSupportConfiguration.mailTemplateEditPolicy
  • CIAS/cias-notification/docs/adr – ADR-019 (Abschnitt 7, Nachtrag 2026-10-01)
Suchen