59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
"""Web authentication routes (session-based)."""
|
|
|
|
from fastapi import APIRouter, Request, Form, Depends, HTTPException
|
|
from fastapi.responses import RedirectResponse, HTMLResponse
|
|
from sqlalchemy.orm import Session
|
|
from ..database import get_db
|
|
from ..services.auth_service import AuthService
|
|
from ..utils.security import verify_password
|
|
from .deps import get_flashed_messages
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/login", response_class=HTMLResponse)
|
|
async def login_page(request: Request):
|
|
"""Show login page."""
|
|
# If already logged in, redirect to dashboard
|
|
if request.session.get("user_id"):
|
|
return RedirectResponse(url="/dashboard", status_code=303)
|
|
|
|
return request.app.state.templates.TemplateResponse(
|
|
"auth/login.html",
|
|
{"request": request, "error": None, "flash_messages": get_flashed_messages(request)}
|
|
)
|
|
|
|
|
|
@router.post("/login", response_class=HTMLResponse)
|
|
async def login_submit(
|
|
request: Request,
|
|
username: str = Form(...),
|
|
password: str = Form(...),
|
|
remember: bool = Form(False),
|
|
db: Session = Depends(get_db)
|
|
):
|
|
"""Process login form."""
|
|
auth_service = AuthService(db)
|
|
user = auth_service.authenticate_user(username, password)
|
|
|
|
if not user:
|
|
return request.app.state.templates.TemplateResponse(
|
|
"auth/login.html",
|
|
{"request": request, "error": "Ungültige Anmeldedaten", "flash_messages": []}
|
|
)
|
|
|
|
# Store user in session
|
|
request.session["user_id"] = user.id
|
|
request.session["username"] = user.username
|
|
request.session["role"] = user.role.value
|
|
request.session["tenant_id"] = user.tenant_id
|
|
|
|
return RedirectResponse(url="/dashboard", status_code=303)
|
|
|
|
|
|
@router.get("/logout")
|
|
async def logout(request: Request):
|
|
"""Logout user."""
|
|
request.session.clear()
|
|
return RedirectResponse(url="/login", status_code=303)
|