"""FastAPI 依赖注入""" from fastapi import Depends, HTTPException, status from fastapi.security import OAuth2PasswordBearer from sqlalchemy.orm import Session from jose import JWTError from .database import get_db from .security import decode_access_token from .models import User from .permissions import get_user_permissions oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/auth/login") def get_current_user( token: str = Depends(oauth2_scheme), db: Session = Depends(get_db), ) -> User: credentials_exc = HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="无效的认证凭据", headers={"WWW-Authenticate": "Bearer"}, ) try: payload = decode_access_token(token) if payload is None: raise credentials_exc user_id: int = payload.get("sub") if user_id is None: raise credentials_exc except JWTError: raise credentials_exc user = db.query(User).filter(User.id == int(user_id)).first() if user is None or not user.is_active: raise credentials_exc return user def require_permission(permission: str): """权限检查依赖工厂。用法: Depends(require_permission('user:create'))""" def checker(current_user: User = Depends(get_current_user)) -> User: if not current_user.is_active: raise HTTPException(status_code=403, detail="账号已禁用") perms = get_user_permissions(current_user) if permission not in perms: raise HTTPException(status_code=403, detail=f"无权限: {permission}") return current_user return checker