2.9 KiB
2.9 KiB
title
| title |
|---|
| Impersonation (Admin → User Session) |
Impersonation (Admin → User Session)
Scope
- Impersonation einer Benutzersession durch einen Admin
POST /login/impersonateEndpoint im Mock-Interceptor- UI-Trigger im UserDetailDrawer (Button + ConfirmDialog)
- Amber-Banner im AdminLayout mit Stop-Button
- Rollback zur Admin-Session via
stopImpersonation() - Berechtigungen: SystemAdmin (role=0) kann alle User impersonaten; OrgAdmin nur User in eigenen Orgs (Serverseitig geprüft)
Prerequisites
- Run in mock mode only (real impersonation requires live tibi-server)
- Admin-Benutzer
admin(role=0) und Ziel-Usermaria.schmidt(u2) existieren - Zweiter Admin
peter.gross(u7) existiert für Admin-auf-Admin-Tests - Relevant spec:
tests/e2e/impersonation.spec.ts
Test Cases
| ID | Description | Expected Result | Priority |
|---|---|---|---|
| IMP-01 | Admin sieht "Als Benutzer einloggen"-Button im UserDetailDrawer | Button mit mdiLogin Icon ist sichtbar für role=0 |
High |
| IMP-02 | Admin klickt Impersonate → ConfirmDialog erscheint | ConfirmDialog variant="info" mit Titel und Nachricht | High |
| IMP-03 | Admin bestätigt Impersonation → Weiterleitung zu /projects | Amber-Banner "Eingeloggt als @maria.schmidt" sichtbar; User-Menü zeigt Maria Schmidt | High |
| IMP-04 | Impersonation-Banner zeigt korrekte Impersonation-Info | Banner enthält "(Impersonation SystemAdmin)" | High |
| IMP-05 | Stop-Button im Banner → Admin-Session wiederhergestellt | Zurück zu /projects mit Admin-User im User-Menü; Banner verschwunden | High |
| IMP-06 | Nicht-Admin (role=1) sieht KEINEN Impersonate-Button | Button ist nicht sichtbar für maria.schmidt | High |
| IMP-07 | Admin sieht Impersonate-Button NICHT für sich selbst | admin (u1) kann sich nicht selbst impersonaten | Medium |
| IMP-08 | Admin-zu-Admin Impersonation (admin → peter.gross) funktioniert | Impersonation auf peter.gross möglich; Banner zeigt "@peter.gross" | Medium |
| IMP-09 | Impersonation-Banner verschwindet nach page.reload() | sessionStorage stellt impersonatedBy-State wieder her | Medium |
| IMP-10 | Admin sieht Impersonate-Button auch für User ohne Org/Team | solo.user (u8) hat Impersonate-Button | Low |
Edge Cases
- Impersonation des eigenen Users: Button muss versteckt sein (canImpersonate = isAdmin && user.id !== currentUser.id)
- Mock-Interceptor lehnt Impersonation ab, wenn currentUser nicht role=0 ist (403)
- Mock-Interceptor gibt 404 bei unbekannter userId
- Nach Stop-Impersonation muss die Admin-Original-Session wiederhergestellt sein (via singleRefresh)
- Bei fehlendem Original-Token (sessionStorage gelöscht) → full logout (Fallback)
Accessibility
- Amber-Banner hat
data-ai-id="impersonation-banner"für Test-Selektion - Stop-Button hat
data-ai-id="impersonation-stop-btn" - Impersonate-Button hat
data-ai-id="impersonate-btn" - Farbkontrast: Amber auf hell/dunkel erfüllt WCAG AA