fix(quick-260914-ebg): Zielrollen-Riegel in UserController.update/remove — ADMIN kann SUPER_ADMIN nicht mehr aendern oder loeschen (WINDOWS #29)

- update(): Riegel nach der Mandantengrenze, vor der dto.role-Pruefung — Nicht-SUPER_ADMIN darf SUPER_ADMIN-Ziel nicht mehr aendern (Kennwort, isActive, Rolle, Anmeldename, E-Mail)
- remove(): derselbe Riegel nach der Mandantengrenze, vor userService.delete
- acht neue Tests (Test 9-16): drei Angriffsformen, SUPER_ADMIN-gegen-SUPER_ADMIN-Regression, ADMIN-gegen-USER-Regression, Reihenfolge-Ordnungstests je Handler
- RED-Lauf vor dem Riegel: Tests  2 failed | 14 passed (16) (Test 9, Test 13 rot); GREEN danach: Tests  16 passed (16)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018N9CD3ebPKm1b32bPpBknY
This commit is contained in:
2026-09-14 10:35:23 +02:00
parent e76c0f8a33
commit 759ea3b2ca
2 changed files with 133 additions and 0 deletions
+18
View File
@@ -188,6 +188,17 @@ export class UserController {
throw new ForbiddenException('Cannot modify users from other tenants');
}
// Zielrollen-Riegel (WINDOWS #29, 260914-ebg): die Pruefung unten sichert
// nur die NEUE Zuweisung der obersten Rolle (dto.role) — dieser Riegel
// sichert das ZIEL, das die oberste Rolle bereits traegt, gegen JEDES
// Feld dieses DTO (Kennwort, isActive, Rolle, Anmeldename, E-Mail).
// Vorlage: `AuthService.adminResetPassword` (T-FH9-04). Die
// Mandantengrenze bleibt DAVOR, damit die Meldung nichts ueber die
// Rolle eines fremdmandantigen Benutzers verraet (T-EBG-04).
if (user.role === Role.SUPER_ADMIN && currentUser.role !== Role.SUPER_ADMIN) {
throw new ForbiddenException('Cannot modify a SUPER_ADMIN user');
}
// T-02-08: ADMIN cannot set role to SUPER_ADMIN
if (currentUser.role !== Role.SUPER_ADMIN && dto.role === Role.SUPER_ADMIN) {
throw new ForbiddenException('Cannot assign SUPER_ADMIN role');
@@ -244,6 +255,13 @@ export class UserController {
throw new ForbiddenException('Cannot delete users from other tenants');
}
// Zielrollen-Riegel (WINDOWS #29, 260914-ebg): derselbe Riegel wie in
// update() oben — ein Nicht-SUPER_ADMIN darf den SUPER_ADMIN seines
// Mandanten nicht loeschen.
if (user.role === Role.SUPER_ADMIN && currentUser.role !== Role.SUPER_ADMIN) {
throw new ForbiddenException('Cannot delete a SUPER_ADMIN user');
}
// Gebunden an den Mandanten des ZIELBENUTZERS, derselbe Grund wie bei
// update() oben.
await this.userService.delete(user.tenantId, id);