加入用户登录体系,session cookie 鉴权,默认账号 admin/admin123

This commit is contained in:
2026-07-24 22:17:18 +08:00
parent 273924a36a
commit c628e208ca
6 changed files with 198 additions and 6 deletions
+52
View File
@@ -0,0 +1,52 @@
from fastapi import APIRouter, Depends, Form, Request
from fastapi.responses import HTMLResponse, RedirectResponse
from sqlalchemy.orm import Session
from app.database import get_db
from app.models import User
router = APIRouter(prefix="/auth", tags=["auth"])
SESSION_COOKIE = "ft_session"
def get_current_user(request: Request, db: Session = Depends(get_db)) -> User | None:
user_id = request.cookies.get(SESSION_COOKIE)
if not user_id:
return None
try:
return db.query(User).filter(User.id == int(user_id)).first()
except (ValueError, TypeError):
return None
@router.get("/login", response_class=HTMLResponse)
def login_page(request: Request):
template = request.app.state.templates.get_template("login.html")
return HTMLResponse(template.render(request=request))
@router.post("/login")
def login(
request: Request,
username: str = Form(...),
password: str = Form(...),
db: Session = Depends(get_db),
):
user = db.query(User).filter(User.username == username).first()
if not user or not user.check_password(password):
template = request.app.state.templates.get_template("login.html")
return HTMLResponse(
template.render(request=request, error="用户名或密码错误"),
status_code=401,
)
resp = RedirectResponse("/contracts/", status_code=303)
resp.set_cookie(SESSION_COOKIE, str(user.id), httponly=True, max_age=86400 * 7)
return resp
@router.get("/logout")
def logout():
resp = RedirectResponse("/auth/login", status_code=303)
resp.delete_cookie(SESSION_COOKIE)
return resp