factory/mcp_server/context.py

33 lines
1.2 KiB
Python

from typing import Any
from django.contrib.auth import get_user_model
from mcp.server.auth.middleware.auth_context import get_access_token
from apps.utils.permission import has_perm
def authenticated_user_claims() -> dict[str, Any]:
"""返回当前请求中经过 Factory JWT 校验的用户摘要。"""
access_token = get_access_token()
claims = access_token.claims if access_token else None
user = claims.get("factory_user") if claims else None
if not isinstance(user, dict):
raise RuntimeError("当前 MCP 请求缺少有效的 Factory 用户身份")
return user
def authenticated_factory_user():
"""加载当前 JWT 对应的 Django 用户,供权限和数据范围逻辑复用。"""
claims = authenticated_user_claims()
try:
return get_user_model().objects.select_related("belong_dept").get(
pk=claims["id"]
)
except (KeyError, get_user_model().DoesNotExist) as exc:
raise RuntimeError("当前 JWT 对应的 Factory 用户不存在") from exc
def require_permission(user, permission_code: str) -> None:
if not has_perm(user, [permission_code]):
raise PermissionError(f"当前用户缺少权限:{permission_code}")