加入用户登录体系,session cookie 鉴权,默认账号 admin/admin123
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user