from fastapi import Depends, HTTPException, status from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer from sqlalchemy.ext.asyncio import AsyncSession from app.models.base import async_session from app.models.user import User from app.services.auth import decode_access_token from sqlalchemy import select security = HTTPBearer(auto_error=False) async def get_db(): async with async_session() as session: try: yield session await session.commit() except Exception: await session.rollback() raise finally: await session.close() async def get_current_user( credentials: HTTPAuthorizationCredentials | None = Depends(security), db: AsyncSession = Depends(get_db), ) -> User: if not credentials: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="未登录", ) user_id = decode_access_token(credentials.credentials) if not user_id: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="登录已过期", ) # Skip captcha tokens if user_id.startswith("captcha:"): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="无效的凭证", ) result = await db.execute(select(User).where(User.id == user_id)) user = result.scalar_one_or_none() if not user or not user.is_active: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="账号不存在或已禁用", ) return user async def get_admin_user( current_user: User = Depends(get_current_user), ) -> User: if not current_user.is_admin or current_user.user_type != "admin": raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="需要管理员权限", ) return current_user