31 lines
1.2 KiB
Python
31 lines
1.2 KiB
Python
"""依赖: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
|