53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
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
|