deps.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. """FastAPI dependencies: DB session, current user, role guards."""
  2. from fastapi import Depends, HTTPException, status
  3. from fastapi.security import OAuth2PasswordBearer
  4. from sqlalchemy.orm import Session
  5. from app.database import get_db
  6. from app.core.security import decode_access_token
  7. from app.models.user import User
  8. oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/auth/login")
  9. def get_current_user(
  10. token: str = Depends(oauth2_scheme),
  11. db: Session = Depends(get_db),
  12. ) -> User:
  13. payload = decode_access_token(token)
  14. if payload is None:
  15. raise HTTPException(
  16. status_code=status.HTTP_401_UNAUTHORIZED,
  17. detail="无效或过期的认证凭据",
  18. headers={"WWW-Authenticate": "Bearer"},
  19. )
  20. user_id: int | None = payload.get("sub")
  21. if user_id is None:
  22. raise HTTPException(
  23. status_code=status.HTTP_401_UNAUTHORIZED,
  24. detail="无效的认证凭据",
  25. )
  26. user = db.query(User).filter(User.id == user_id, User.del_flag == 0).first()
  27. if user is None:
  28. raise HTTPException(
  29. status_code=status.HTTP_401_UNAUTHORIZED,
  30. detail="用户不存在",
  31. )
  32. if user.status != 1:
  33. raise HTTPException(
  34. status_code=status.HTTP_403_FORBIDDEN,
  35. detail="用户已被禁用",
  36. )
  37. return user
  38. def require_roles(*role_codes: str):
  39. """Dependency factory: currently bypasses role check."""
  40. def _check(current_user: User = Depends(get_current_user)):
  41. return current_user
  42. return _check