From 5eabdbd180b4c0e4f52a9ff3718d2d896d6fb6b2 Mon Sep 17 00:00:00 2001 From: Thomas Stallinger Date: Wed, 26 Aug 2026 09:49:42 +0200 Subject: [PATCH] =?UTF-8?q?ADR-0019=20Nachtrag:=20Self-Service-Passwort?= =?UTF-8?q?=C3=A4nderung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 --- ...sverwaltung-stammdaten-und-kontenrollen.md | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/adr/0019-organisationsverwaltung-stammdaten-und-kontenrollen.md b/adr/0019-organisationsverwaltung-stammdaten-und-kontenrollen.md index 1ab9cbc..b3cdf35 100644 --- a/adr/0019-organisationsverwaltung-stammdaten-und-kontenrollen.md +++ b/adr/0019-organisationsverwaltung-stammdaten-und-kontenrollen.md @@ -113,3 +113,37 @@ Organization-Kontaktfelder ergänzt. `benutzer` (inkl. der neuen Tabelle lebt in `kundenplattform`s eigener, von `provisioning-server` getrennter Datenbank (siehe ADR-0011) und war schon vorher nicht Bestandteil dieses Dokuments. + +## Nachtrag 26.08.2026: Self-Service-Passwortänderung + +Der ursprüngliche Umfang dieser ADR deckte Kontenverwaltung (Anlegen/ +Löschen fremder Konten durch `require_org_admin`) ab, aber keine +Möglichkeit für einen Nutzer, sein **eigenes** Passwort zu ändern — dafür +war bislang ausschließlich das CLI-Skript `scripts/reset_password.py` +(aus der Sicherheitshärtung vom 25.08.2026) zuständig, nicht per +Self-Service erreichbar. + +Neue Route `POST /organisation/passwort`, neue Sektion „Mein Konto" auf +derselben `/organisation`-Seite. Bewusst **ohne** `require_org_admin` — +anders als Kontenverwaltung für Dritte braucht das eigene Passwort keine +besondere Rolle, jedes eingeloggte Konto darf es ändern. Prüft das +aktuelle Passwort über `user_manager.authenticate()` (gleiches Muster wie +der Login in `auth.py`), validiert das neue Passwort explizit gegen die +bestehende `UserManager.validate_password()`-Policy (≥12 Zeichen, nicht +gleich der E-Mail-Adresse, siehe Sicherheitshärtung 25.08.2026) und zeigt +Fehler inline auf derselben Seite statt als nackte `HTTPException` — +dafür wurde die Kontext-Beschaffung aus `organisation_ansicht()` in eine +gemeinsame Hilfsfunktion `_organisation_kontext()` ausgelagert. + +Bekannte, akzeptierte Einschränkung: die JWT-Session bleibt nach einer +Passwortänderung bis zu ihrem regulären Ablauf gültig (kein +Session-Revocation-Mechanismus vorhanden, war auch vorher schon so) — +ein bereits eingeloggtes Gerät wird durch eine Passwortänderung nicht +automatisch ausgeloggt. + +Live auf anode verifiziert (WLAN-Test-Fixture-Konto, Passwort danach auf +den dokumentierten Fixture-Wert zurückgesetzt): falsches aktuelles +Passwort, zu kurzes neues Passwort, nicht übereinstimmende Wiederholung +liefern je `400` mit der passenden Inline-Fehlermeldung; der Erfolgsfall +liefert `303`, das alte Passwort funktioniert danach nicht mehr, das neue +sofort.