32 lines
1.3 KiB
Python
32 lines
1.3 KiB
Python
"""认证依赖"""
|
||
import jwt
|
||
from fastapi import Depends, HTTPException, status
|
||
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
||
|
||
from .config import JWT_SECRET, JWT_ALGORITHM
|
||
|
||
security = HTTPBearer()
|
||
|
||
|
||
def decode_current_user(token: str) -> dict:
|
||
"""验证 JWT token,返回用户身份。"""
|
||
try:
|
||
payload = jwt.decode(token, JWT_SECRET, algorithms=[JWT_ALGORITHM])
|
||
return {"username": payload["sub"], "is_admin": payload.get("is_admin", False)}
|
||
except jwt.ExpiredSignatureError:
|
||
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="登录已过期,请重新登录")
|
||
except jwt.InvalidTokenError:
|
||
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="无效的认证凭据")
|
||
|
||
|
||
def get_current_user(credentials: HTTPAuthorizationCredentials = Depends(security)) -> dict:
|
||
"""验证 HTTP Bearer JWT token,返回用户信息。"""
|
||
return decode_current_user(credentials.credentials)
|
||
|
||
|
||
def require_admin(user: dict = Depends(get_current_user)) -> dict:
|
||
"""限制仅管理员可访问的管理和敏感配置接口。"""
|
||
if not user.get("is_admin"):
|
||
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="需要管理员权限")
|
||
return user
|