add user management

This commit is contained in:
team 1
2026-05-11 14:26:09 +02:00
parent 4d9ba6c7fc
commit acb1082398
13 changed files with 1246 additions and 66 deletions

View File

@@ -0,0 +1,148 @@
# RETRIEX PATCH 93 - Admin User Management CRUD
## Ziel
Ergaenzt eine saubere Benutzerverwaltung im Adminbereich, damit neue Benutzer nicht mehr nur per Console angelegt werden muessen.
Der Patch fuegt CRUD-nahe Adminfunktionen fuer Benutzer hinzu:
- Benutzerliste im Adminbereich
- Benutzer anlegen
- Benutzer bearbeiten
- Rollen zuweisen
- Passwort setzen bzw. zuruecksetzen
- Benutzer aktivieren/deaktivieren
- Self-Protection gegen versehentliches Aussperren
- Login-Blocker fuer deaktivierte Benutzer
## Architektur
Der Patch greift nicht in RAG-, Retrieval-, Scoring-, Prompt-, Shop- oder Chat-Antwortlogik ein.
Neue Admin-Route:
- `GET /admin/users`
- `GET /admin/users/create`
- `POST /admin/users/create`
- `GET /admin/users/{id}/edit`
- `POST /admin/users/{id}/edit`
- `POST /admin/users/{id}/toggle-active`
Alle Routen sind nur fuer `ROLE_SUPER_ADMIN` erreichbar.
## Neue Dateien
- `src/Controller/Admin/UserController.php`
- `src/Service/Admin/UserAdminService.php`
- `src/Security/ApplicationRoles.php`
- `src/Security/ActiveUserChecker.php`
- `src/Security/ActiveUserSessionSubscriber.php`
- `templates/admin/user/index.html.twig`
- `templates/admin/user/create.html.twig`
- `templates/admin/user/edit.html.twig`
## Geaenderte Dateien
- `config/packages/security.yaml`
- `templates/admin/base.html.twig`
- `src/Repository/UserRepository.php`
- `src/Command/CreateUserCommand.php`
## Optimierungen gegenueber dem ersten Konzept
- Rollen werden zentral in `ApplicationRoles` gepflegt.
- Admin-UI und Console-Command nutzen dieselbe Rollenquelle.
- Benutzerliste hat einfache Filter fuer Suche, Status und Rolle.
- `isActive` ist nicht nur ein UI-Feld, sondern wird ueber `ActiveUserChecker` beim Login erzwungen.
- Bereits angemeldete deaktivierte Benutzer werden ueber `ActiveUserSessionSubscriber` aus der Session abgemeldet.
- Kein hartes Delete im ersten Schritt, um Referenzprobleme mit Dokumenten, Versionen oder Jobs zu vermeiden.
## Rollen
Zuweisbare Rollen:
- `ROLE_SUPER_ADMIN`
- `ROLE_KNOWLEDGE_ADMIN`
- `ROLE_EDITOR`
- `ROLE_ADMIN_AREA`
- `ROLE_CHAT_USER`
`ROLE_USER` bleibt bewusst nicht manuell auswaehlbar, weil `User::getRoles()` diese Rolle automatisch ergaenzt.
## Schutzregeln
Der Patch verhindert:
- eigenen Benutzer deaktivieren
- eigene `ROLE_SUPER_ADMIN`-Rolle entfernen
- letzten aktiven Super-Admin deaktivieren
- letzten aktiven Super-Admin demoten
- Login mit deaktiviertem Benutzer
- Weiterbenutzung bereits bestehender Sessions nach Deaktivierung
## Console-Command
`mto:agent:user:create` bleibt erhalten und wurde vereinheitlicht:
- nutzt `ApplicationRoles`
- erlaubt mehrere Rollen per Mehrfachauswahl
- fragt Passwort-Wiederholung ab
- fragt Aktivstatus ab
## Lokale Checks
Ausgefuehrt im Patch-Arbeitsstand:
```bash
php -l src/Security/ApplicationRoles.php
php -l src/Security/ActiveUserChecker.php
php -l src/Security/ActiveUserSessionSubscriber.php
php -l src/Repository/UserRepository.php
php -l src/Service/Admin/UserAdminService.php
php -l src/Controller/Admin/UserController.php
php -l src/Command/CreateUserCommand.php
python3 -c "import yaml; yaml.safe_load(open('config/packages/security.yaml'))"
```
Twig wurde per Delimiter-Smoke-Test geprueft.
Nicht lokal ausfuehrbar, weil `vendor/` im ZIP nicht enthalten ist:
```bash
php bin/console lint:yaml config/packages/security.yaml
php bin/console lint:twig templates/admin/user
php bin/console debug:router | grep admin_users
```
## Empfohlene Checks in der Zielumgebung
```bash
php bin/console cache:clear
php bin/console lint:yaml config/packages/security.yaml
php bin/console lint:twig templates/admin/user
php bin/console debug:router | grep admin_users
php bin/console mto:agent:config:validate
php bin/console mto:agent:regression:test
php bin/console mto:agent:config:audit-source --details
```
## Manuelle Testfaelle
1. Als `ROLE_SUPER_ADMIN` `/admin/users` oeffnen.
2. Neuen Chat-User mit `ROLE_CHAT_USER` anlegen.
3. Mit diesem User im Chat einloggen.
4. User deaktivieren und Login im Chat pruefen.
5. User wieder aktivieren und Login pruefen.
6. Passwort im Edit-Formular setzen und Login pruefen.
7. Versuch: eigener Benutzer deaktivieren -> muss blockieren.
8. Versuch: eigene `ROLE_SUPER_ADMIN` entfernen -> muss blockieren.
9. Versuch: letzter aktiver Super-Admin deaktivieren/demoten -> muss blockieren.
## Bewusst nicht enthalten
- hartes Loeschen von Benutzern
- Passwort-Reset per E-Mail
- Einladungslinks
- Audit-Log fuer Useraenderungen
- 2FA
- Mandantenfaehigkeit