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
| Aufruf | Tut |
|---|---|
GET /cias/notification/templates | alle Vorlagen, die du sehen darfst |
POST /cias/notification/templates | eine Vorlage speichern: anlegen oder ersetzen |
POST /cias/notification/templates/{id}/reset | eine 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
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
}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
}| Feld | Bedeutung |
|---|---|
id | fehlt: anlegen, oder die Vorlage mit denselben Merkmalen ersetzen. Gesetzt: genau diese Vorlage ersetzen |
key | welche Mail, siehe Welche Mails es gibt |
tenantKey | fü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 |
locale | die Sprache, etwa de oder en |
subject, body | Betreff und Text, mit Platzhaltern wie ${loginUrl} |
html | ob der Text HTML ist. Dann schickt CIAS zusätzlich eine reine Textfassung mit |
updatedBy, updatedAt | wer zuletzt geändert hat und wann. Die Person kommt aus dem Token. Leer bei einer ausgelieferten Fassung |
origin | PACKAGED, solange es der ausgelieferte Text ist, EDITED, sobald jemand ihn geändert hat |
isDefault | ob 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
-
CIASangemeldetHat die Anfrage ein Token, und nennt es die Person?↳ nein 403
cias.notification.template-forbidden -
CIASEditor?ja → darf jede Vorlage, der Mandant kommt aus
tenantKey -
CIASMandanten-AdministratorHat der Aufrufer die Mandanten-Administrator-Rolle, und nennt sein Token einen Mandanten?↳ nein 403
cias.notification.template-forbidden -
CIASfreigegebene ArtSteht die Mail auf der Liste, die Mandanten ändern dürfen?↳ nein 422
cias.notification.template-rejected -
CIASeigene VorlageBeim Ersetzen per
id: Gehört die Vorlage dem eigenen Mandanten, und ist es keine Standardfassung?↳ nein 403cias.notification.template-forbidden -
CIASlässt sich erzeugenCIAS 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 - 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.
| Installation | Editoren | Mandanten-Rolle | Mails, die Mandanten ändern dürfen |
|---|---|---|---|
| eigenständiges CIAS | aus CIAS_NOTIFICATION_EDITOR_ROLES, Standard platform-admin, mail-template-admin | tenant-admin | MEMBERSHIP_INVITATION, INVITATION, WELCOME |
| eingebettet im Hub-Backend | die Plattform-Administrator-Rollen der Installation, dazu dieselbe Einstellung | tenant-admin | keine |
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_EMAILundPASSWORD_SETUPtragen einen Link, der ein Konto öffnet. Wer sie umformulieren kann, schreibt eine überzeugende Phishing-Mail vom Absender der Plattform.ALREADY_REGISTEREDgeht womöglich an jemanden aus einem ganz anderen Mandanten.APPROVAL_PENDINGundREJECTEDformulieren eine Entscheidung. Wer entscheidet, soll sie nicht nachträglich umschreiben.
Die Ausprägungen
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
| Antwort | Wann |
|---|---|
400 cias.notification.invalid-payload | Pflichtfeld fehlt, Feld zu lang (Betreff bis 512, Text bis 65535 Zeichen), ungültiger Mail-Schlüssel |
403 cias.notification.template-forbidden | nicht angemeldet, keine passende Rolle, fremde Vorlage, Mandanten-Administrator will zurücksetzen |
404 cias.notification.template-not-found | id unbekannt oder für dich unsichtbar |
| 404 ohne Body | die Aufrufe sind in dieser Installation ausgeschaltet |
422 cias.notification.template-rejected | Mandanten dürfen diese Mail nicht ändern, Vorlage lässt sich nicht erzeugen, Standardfassung löschen, nichts zum Zurücksetzen |