feat(auth): Anmeldeseiten, TOTP-Einrichtung und Bestaetigung (#004)

Anmeldung, Einrichtung des zweiten Faktors fuer den Notfall-Admin,
erneute Bestaetigung vor kritischen Aktionen und die Seite fuer
fehlende Rechte. Die Huelle zeigt jetzt den echten Benutzer, und jede
Seite prueft die Sitzung selbst; ein struktureller Test haelt das fest.

Die Ablaeufe sind im gebauten Stand gegen den Mock-OIDC geprueft
(pnpm test:e2e): Admin, Konto ohne Gruppe, Notfall-Admin mit TOTP.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 09:28:51 +02:00
co-authored by Claude Opus 5.5
parent 4d0044b380
commit d1ba822a4a
37 changed files with 763 additions and 38 deletions
+10 -7
View File
@@ -1,13 +1,16 @@
import type { HuellenBenutzer } from "@/components/huelle/typen";
import { sitzungErforderlich } from "@/server/auth/sitzungspflicht";
/**
* Liefert den Benutzer, den die Seitenleiste anzeigt.
*
* TODO (#004): durch die echte Sitzung ersetzen (Benutzer + Rolle aus der Datenbank,
* Herkunft „authentik“ oder „Notfall-Admin“) und ohne Sitzung zur Anmeldung umleiten.
* Bis dahin ein fester Beispielbenutzer, damit der Prototyp ohne Anmeldung läuft.
* async schon jetzt, damit sich die Aufrufer beim Umstieg nicht ändern müssen.
* Der Benutzer fuer die Seitenleiste – aus der echten Sitzung (#004). Ohne Sitzung leitet
* `sitzungErforderlich` zur Anmeldung weiter.
*/
export async function huellenBenutzerErmitteln(): Promise<HuellenBenutzer> {
return { name: "Florian Wilde", rolle: "ADMIN", herkunft: "authentik" };
const { benutzer, sitzung } = await sitzungErforderlich();
return {
name: benutzer.name,
rolle: benutzer.rolle,
herkunft:
sitzung.herkunft === "notfall" ? "Notfallzugang" : (process.env["SSHKV_OIDC_NAME"] ?? "authentik"),
};
}