bx_auth.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. """报销模块认证适配:门户 JWT 用户 → bx 业务上下文。"""
  2. from __future__ import annotations
  3. from dataclasses import dataclass
  4. from typing import Any, Dict
  5. from fastapi import Depends
  6. from app.core.menu_guard import require_admin_or_super_admin
  7. @dataclass
  8. class BxUserContext:
  9. """bx Service/Router 使用的当前用户上下文(sys_user.id 为 UUID 字符串)。"""
  10. id: str
  11. name: str
  12. dept_id: str
  13. role: str
  14. tenant_no: str
  15. def to_tenant_user_dict(self) -> Dict[str, Any]:
  16. """供 get_tenant_no 等门户工具使用。"""
  17. return {
  18. "user_id": self.id,
  19. "role": self.role,
  20. "tenant_no": self.tenant_no,
  21. }
  22. def to_user_info(self) -> Dict[str, Any]:
  23. """与门户 JWT / apply_data_scope 所需的 user_info 字段对齐。"""
  24. return {
  25. "user_id": self.id,
  26. "role": self.role,
  27. "tenant_no": self.tenant_no,
  28. "dept_id": self.dept_id,
  29. "region_id": self.dept_id,
  30. }
  31. def get_bx_current_user(
  32. user: dict = Depends(require_admin_or_super_admin),
  33. ) -> BxUserContext:
  34. return BxUserContext(
  35. id=(user.get("user_id") or "").strip(),
  36. name=(user.get("real_name") or user.get("username") or "").strip(),
  37. dept_id=(user.get("region_id") or "").strip(),
  38. role=(user.get("role") or "").strip(),
  39. tenant_no=(user.get("tenant_no") or "").strip(),
  40. )