auth.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. """鉴权路由:login / logout / current-user / menus"""
  2. from typing import Annotated
  3. from fastapi import APIRouter, Depends, Request
  4. from fastapi.responses import JSONResponse
  5. from sqlalchemy.orm import Session
  6. from app.core.database import get_db
  7. from app.core.deps import get_current_user
  8. from app.core.response import error_response, success_response
  9. from app.models.system import SysUser
  10. from app.schemas.auth import LoginBody
  11. from app.services import auth_service
  12. router = APIRouter(prefix="/web/auth", tags=["auth"])
  13. @router.post("/login")
  14. def login(body: LoginBody, request: Request, db: Annotated[Session, Depends(get_db)]):
  15. ip = request.client.host if request.client else None
  16. try:
  17. data = auth_service.login(db, body.username, body.password, ip=ip)
  18. except auth_service.AuthFailure as exc:
  19. return JSONResponse(
  20. status_code=401,
  21. content=error_response(401, exc.message),
  22. )
  23. return success_response(data)
  24. @router.post("/logout")
  25. def logout(user: Annotated[SysUser, Depends(get_current_user)]):
  26. return success_response({"username": user.username})
  27. @router.get("/current-user")
  28. def current_user(
  29. user: Annotated[SysUser, Depends(get_current_user)],
  30. db: Annotated[Session, Depends(get_db)],
  31. ):
  32. try:
  33. data = auth_service.current_user_payload(db, user.id)
  34. except auth_service.AuthFailure as exc:
  35. return JSONResponse(
  36. status_code=401,
  37. content=error_response(401, exc.message),
  38. )
  39. return success_response(data)
  40. @router.get("/menus")
  41. def menus(
  42. user: Annotated[SysUser, Depends(get_current_user)],
  43. db: Annotated[Session, Depends(get_db)],
  44. ):
  45. return success_response(auth_service.menus_payload(db, user.role_id))