from fastapi import Cookie, Depends, HTTPException, status from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.core.security import decode_access_token from app.db.database import get_db from app.db.models import User async def get_current_user( access_token: str | None = Cookie(default=None), db: AsyncSession = Depends(get_db), ) -> User | None: """获取当前用户(可选)。""" if not access_token: return None payload = decode_access_token(access_token) if not payload: return None user_id = payload.get("sub") if not user_id: return None result = await db.execute(select(User).where(User.id == user_id)) return result.scalar_one_or_none() async def require_user( user: User | None = Depends(get_current_user), ) -> User: """要求用户登录,否则抛 401。""" if not user: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="未登录", ) return user