generated from bastian/boilerplate
122 lines
3.9 KiB
Markdown
122 lines
3.9 KiB
Markdown
# Adminbereich
|
|
|
|
Der Adminbereich liegt im Frontend unter `/admin` und verwendet dieselbe
|
|
serverseitige Authentifizierung, CSRF-Pruefung und Permission-Logik wie die
|
|
restliche Anwendung. Angular blendet Navigation und Aktionen nur fuer passende
|
|
Permissions ein; verbindlich prueft immer das Backend.
|
|
|
|
## Permissions
|
|
|
|
Die administrativen Permissions sind fest in
|
|
`apps/backend/src/roles/permissions.ts` definiert:
|
|
|
|
- `users.read`: Benutzer anzeigen, suchen und filtern
|
|
- `users.manage`: Benutzer aktivieren, deaktivieren und Rollen zuweisen
|
|
- `roles.read`: Rollen und Permissions anzeigen
|
|
- `roles.manage`: Rollen anlegen, bearbeiten und loeschen
|
|
- `sessions.manage`: Sessions anderer Benutzer anzeigen und beenden
|
|
- `audit.read`: administratives Audit-Log anzeigen
|
|
|
|
Benutzer haben keine direkten Permissions. Effektive Permissions werden aus
|
|
allen Rollen abgeleitet. Rollen- und Benutzerverwaltung laufen ueber Services;
|
|
Controller greifen nicht direkt auf TypeORM-Repositories zu.
|
|
|
|
## Systemrollen
|
|
|
|
Es gibt mindestens die Systemrollen `admin` und `user`.
|
|
|
|
- `admin` ist geschuetzt, nicht loeschbar und muss administrative Permissions
|
|
behalten.
|
|
- `user` ist geschuetzt, nicht loeschbar und Standardrolle fuer neue Benutzer.
|
|
- Eigene Rollen koennen angelegt, umbenannt, geloescht und mit bekannten
|
|
Permissions versehen werden.
|
|
|
|
Eine Rolle kann nur geloescht werden, wenn sie keinem Benutzer mehr zugewiesen
|
|
ist. Andernfalls antwortet die API mit `ROLE_STILL_ASSIGNED`.
|
|
|
|
## Letzter aktiver Administrator
|
|
|
|
Die Anwendung darf nie ohne aktiven Administrator enden. Sicherheitskritische
|
|
Aktionen laufen transaktional und halten einen MySQL-Lock
|
|
`business_app_admin_integrity`:
|
|
|
|
- Benutzer deaktivieren
|
|
- Rollen eines Benutzers aendern
|
|
- Adminrolle entfernen
|
|
- Adminrolle in ihren Permissions veraendern
|
|
- Rolle loeschen
|
|
|
|
Wenn eine Aktion den letzten aktiven Administrator entfernen wuerde, antwortet
|
|
die API mit HTTP 409 und `LAST_ACTIVE_ADMIN_REQUIRED`.
|
|
|
|
## Benutzerstatus und Sessions
|
|
|
|
Benutzer werden weiterhin ausschliesslich ueber OIDC angelegt. Name und E-Mail
|
|
kommen vom Identity Provider und sind im Adminbereich nicht editierbar.
|
|
|
|
Beim Deaktivieren wird der Benutzer sofort inaktiv gesetzt und alle aktiven
|
|
Sessions des Benutzers werden widerrufen. Neue OIDC-Logins deaktivierter Benutzer
|
|
werden trotz erfolgreicher IdP-Authentifizierung abgewiesen. Beim erneuten
|
|
Aktivieren darf sich der Benutzer wieder anmelden; alte Sessions werden nicht
|
|
wiederhergestellt.
|
|
|
|
Admin-Session-Endpunkte geben nur eine sichere, gekuerzte Session-Referenz,
|
|
Zeitpunkte, User-Agent, IP-Annaeherung und Status zurueck. Tokens und rohe
|
|
Session-Secrets werden nie ausgegeben.
|
|
|
|
## API-Endpunkte
|
|
|
|
Benutzer:
|
|
|
|
- `GET /api/admin/users`
|
|
- `GET /api/admin/users/:id`
|
|
- `PATCH /api/admin/users/:id/deactivate`
|
|
- `PATCH /api/admin/users/:id/activate`
|
|
- `POST /api/admin/users/:id/roles/:roleId`
|
|
- `DELETE /api/admin/users/:id/roles/:roleId`
|
|
- `GET /api/admin/users/:id/sessions`
|
|
- `DELETE /api/admin/users/:userId/sessions/:sessionId`
|
|
- `DELETE /api/admin/users/:id/sessions`
|
|
|
|
Rollen:
|
|
|
|
- `GET /api/admin/roles`
|
|
- `GET /api/admin/roles/:id`
|
|
- `POST /api/admin/roles`
|
|
- `PUT /api/admin/roles/:id`
|
|
- `DELETE /api/admin/roles/:id`
|
|
|
|
Audit:
|
|
|
|
- `GET /api/audit-log`
|
|
|
|
## Audit-Log
|
|
|
|
Administrative Aenderungen werden auditierbar protokolliert, darunter:
|
|
|
|
- `USER_ACTIVATED`
|
|
- `USER_DEACTIVATED`
|
|
- `USER_ROLE_ASSIGNED`
|
|
- `USER_ROLE_REMOVED`
|
|
- `ROLE_CREATED`
|
|
- `ROLE_UPDATED`
|
|
- `ROLE_DELETED`
|
|
- `ROLE_PERMISSIONS_UPDATED`
|
|
- `SESSION_REVOKED`
|
|
- `ALL_USER_SESSIONS_REVOKED`
|
|
|
|
Gespeichert werden fachliche IDs, Request-ID und minimale Metadaten. Tokens,
|
|
Secrets und vollstaendige Sessiondaten werden nicht geloggt.
|
|
|
|
## Migration
|
|
|
|
Die Admin-Erweiterung fuegt `roles.description` hinzu. Vor dem Deployment muss
|
|
die Migration ausgefuehrt werden:
|
|
|
|
```bash
|
|
npm run migration:run
|
|
```
|
|
|
|
Der normale App-Start fuehrt Migrationen weiterhin nicht automatisch aus,
|
|
sondern meldet fehlende Migrationen ueber die Readiness-Pruefung.
|