auth via DB

This commit is contained in:
JiriUhlir
2026-05-28 11:40:49 +02:00
parent db039e5988
commit 09c742fefb
11 changed files with 335 additions and 23 deletions
+67
View File
@@ -0,0 +1,67 @@
import html
from fastapi import APIRouter, Form, Request
from fastapi.responses import HTMLResponse, RedirectResponse
from app.auth import authenticate_user, current_user
from app.templates.layout import page
router = APIRouter()
@router.get("/login", response_class=HTMLResponse)
def login_form(request: Request):
if current_user(request):
return RedirectResponse(url="/portal", status_code=303)
return _render_login()
@router.post("/login", response_class=HTMLResponse)
def login(request: Request, username: str = Form(...), password: str = Form(...)):
user = authenticate_user(username, password)
if not user:
return _render_login("Neplatné přihlašovací údaje.")
request.session.clear()
request.session["user_id"] = user["id"]
return RedirectResponse(url="/portal", status_code=303)
@router.post("/logout")
def logout(request: Request):
request.session.clear()
return RedirectResponse(url="/portal/login", status_code=303)
def _render_login(error: str | None = None) -> str:
error_html = ""
if error:
error_html = f'<p class="alert alert-danger">{html.escape(error)}</p>'
return page(
"Přihlášení",
f"""
<div class="auth-card card">
<h2>Přihlášení do portálu</h2>
<p class="muted">Přihlaste se interním účtem AppFactory.</p>
{error_html}
<form method="post" action="/portal/login">
<p>
<label>Uživatelské jméno</label><br>
<input name="username" autocomplete="username" required autofocus>
</p>
<p>
<label>Heslo</label><br>
<input type="password" name="password" autocomplete="current-password" required>
</p>
<button type="submit">Přihlásit</button>
</form>
</div>
""",
)