"""依赖:get_db、JWT 校验。""" from fastapi import Depends, HTTPException, status from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.models import User from app.services.auth_service import decode_access_token security = HTTPBearer(auto_error=False) async def get_current_user( db: AsyncSession = Depends(get_db), credentials: HTTPAuthorizationCredentials | None = Depends(security), ) -> User: if not credentials: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="未提供认证信息") subject = decode_access_token(credentials.credentials) if not subject: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="无效或已过期的 token") # subject 存 username r = await db.execute(select(User).where(User.username == subject)) user = r.scalar_one_or_none() if not user: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="用户不存在") if not user.is_active: raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="账号已禁用") return user