openvpn-endpoint-server/server/app/web/auth.py

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)