Paket A — Plattform-Admin: Benutzerverwaltung je Mandant

In der Mandanten-Detailansicht (/admin/[id]) kann der Plattform-Admin je Kunde
Benutzer anlegen und verwalten — ohne E-Mail-Flow, über Initial-/Einmal-Passwort.

- actions/platform-users.ts (Platform-Session-Guard, dbForTenant(zielTenant),
  Audit scope=platform):
  - createTenantUser: Name, E-Mail (eindeutig je Mandant), ≥1 Rolle; Initialpasswort
    selbst setzen ODER policy-konformes Einmal-Passwort erzeugen (einmalig angezeigt);
    Nutzer mit mustChangePassword=true.
  - resetTenantUserPassword: neues Einmal-Passwort + erzwungener Wechsel.
  - setTenantUserStatus: deaktivieren/reaktivieren.
  - setTenantUserRoles: Mehrfach-Rollenzuweisung.
  - Lockout-Schutz: letzter aktiver Mandanten-Admin kann nicht deaktiviert werden
    und ihm kann die Admin-Rolle nicht entzogen werden.
- components/platform-tenant-users.tsx: Anlege-Formular (useActionState, zeigt das
  Einmal-Passwort), Benutzerkarten mit Rollen-Checkboxen, Status-Toggle und Reset.
- /admin/[id] lädt Nutzer inkl. Rollen + Mandanten-Rollen und rendert die Verwaltung.
- Passwort-Generierung/-Prüfung gegen die Mandanten-Passwort-Policy.
- Zukunftssicher gekapselt: Einladungs-Flow (Paket 4) als alternative Aktivierung
  (Token statt Initialpasswort) später einhängbar.

tsc + lint + build + Guard-Check grün. Browser-E2E folgt zusammen mit Paket C.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-22 09:24:33 +02:00
co-authored by Claude Opus 4.8
parent db36c795bd
commit 908b098400
4 changed files with 306 additions and 14 deletions
+1
View File
@@ -33,6 +33,7 @@ const ACTION_MODULE: Record<string, string> = {
// keine per TenantModule gegateten Fachmodule — eigene Autorisierung, kein moduleGuard.
"admin.ts": "EXEMPT",
"platform.ts": "EXEMPT",
"platform-users.ts": "EXEMPT",
"account.ts": "EXEMPT",
"tenant-settings.ts": "EXEMPT",
};