"""FastAPI-Abhängigkeiten für Authentifizierung und Rollen.""" from __future__ import annotations from fastapi import Depends, Request from sqlalchemy.orm import Session from redaktionskern.auth.models import User class NotAuthenticated(Exception): """Benutzer ist nicht (mehr) angemeldet → Weiterleitung zum Login.""" class AccessDenied(Exception): """Benutzer hat die nötige Rolle nicht → 403-Seite.""" def get_db(request: Request): """Stellt eine Datenbank-Session pro Anfrage bereit.""" db: Session = request.app.state.session_factory() try: yield db finally: db.close() def get_current_user(request: Request, db: Session = Depends(get_db)) -> User | None: user_id = request.session.get("user_id") if user_id is None: return None return db.get(User, user_id) def require_user(user: User | None = Depends(get_current_user)) -> User: if user is None or not user.active: raise NotAuthenticated return user def require_roles(*roles: str): """Abhängigkeits-Fabrik: verlangt eine der angegebenen Rollen.""" def abhaengigkeit(user: User = Depends(require_user)) -> User: if user.role not in roles: raise AccessDenied(f"Rolle '{user.role}' hat keinen Zugriff.") return user return abhaengigkeit