feat: getrennte Login-Seiten für User (/), Admins (/admin/login)

- /admin/login: neue Login-Seite nur für auditor, admin, domain_admin, superadmin
- /: blockiert Admin-Rollen mit Hinweis auf /admin
- useAuth: neuer loginPage-Parameter für flexiblen Unauthentifiziert-Redirect
- /admin: leitet bei Nicht-Auth zu /admin/login statt /

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sysops
2026-03-31 23:47:41 +02:00
co-authored by Claude Sonnet 4.6
parent c1a9004720
commit acc0d93318
4 changed files with 117 additions and 7 deletions
+9 -3
View File
@@ -16,13 +16,15 @@ export default function LoginPage() {
const [error, setError] = useState("");
const [loading, setLoading] = useState(false);
const ADMIN_ROLES = ["auditor", "admin", "domain_admin", "superadmin"];
useEffect(() => {
// Only redirect if we have a cached session — no API call, no loop risk
const cached = getCachedUser();
if (cached !== null) {
router.replace(cached.role === "superadmin" ? "/admin" : "/search");
router.replace(ADMIN_ROLES.includes(cached.role) ? "/admin/login" : "/search");
}
}, [router]);
}, [router]); // eslint-disable-line react-hooks/exhaustive-deps
async function handleSubmit(e: React.FormEvent) {
e.preventDefault();
@@ -32,7 +34,11 @@ export default function LoginPage() {
try {
const res = await login(username, password);
const role = res?.user?.role ?? "";
router.push(role === "superadmin" ? "/admin" : "/search");
if (ADMIN_ROLES.includes(role)) {
setError("Admins und Auditoren bitte über /admin anmelden.");
return;
}
router.push("/search");
} catch {
setError("Anmeldung fehlgeschlagen. Bitte Zugangsdaten pruefen.");
} finally {