web_auth_roles.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. """Web 管理端登录:基于 V0.3 sys_user / sys_user_role / sys_role 的角色与菜单权限解析"""
  2. from __future__ import annotations
  3. from typing import Set
  4. from sqlalchemy import and_
  5. from sqlalchemy.orm import Session
  6. from app.core.config import settings
  7. from app.models.models import SysMenu, SysRole, SysRoleMenu, SysUserRole
  8. def _map_role_name_to_web(role_name: str) -> str:
  9. """将 sys_role.role_name 映射为 web-admin 使用的 role 字符串。"""
  10. n = (role_name or "").strip()
  11. if not n:
  12. return "admin"
  13. if "超级" in n or n in ("系统管理员", "超级管理员"):
  14. return "super_admin"
  15. if "管理" in n or "运营" in n:
  16. return "admin"
  17. return "admin"
  18. def resolve_web_role_for_user(db: Session, user_id: str) -> str:
  19. """根据用户关联角色解析 Web 端 role(admin / super_admin)。"""
  20. if not user_id:
  21. return settings.WEB_AUTH_DEFAULT_ROLE
  22. tenant = settings.DEFAULT_TENANT_NO
  23. rows = (
  24. db.query(SysRole.role_name)
  25. .join(SysUserRole, SysUserRole.role_id == SysRole.id)
  26. .filter(
  27. SysUserRole.user_id == user_id,
  28. SysUserRole.del_flag == 0,
  29. SysUserRole.tenant_no == tenant,
  30. SysRole.del_flag == 0,
  31. SysRole.status == "1",
  32. SysRole.tenant_no == tenant,
  33. )
  34. .order_by(SysRole.create_time.desc())
  35. .all()
  36. )
  37. names = [str(r[0]).strip() for r in rows if r and r[0]]
  38. if not names:
  39. return settings.WEB_AUTH_DEFAULT_ROLE
  40. mapped = [_map_role_name_to_web(n) for n in names]
  41. if "super_admin" in mapped:
  42. return "super_admin"
  43. return "admin"
  44. def iter_user_menu_perm_codes(db: Session, user_id: str) -> Set[str]:
  45. """用户通过角色关联得到的菜单权限标识(sys_menu.perms,空则退回菜单 id)。"""
  46. if not user_id:
  47. return set()
  48. tenant = settings.DEFAULT_TENANT_NO
  49. try:
  50. q = (
  51. db.query(SysMenu.perms, SysMenu.id)
  52. .join(
  53. SysRoleMenu,
  54. and_(
  55. SysRoleMenu.menu_id == SysMenu.id,
  56. SysRoleMenu.del_flag == 0,
  57. SysRoleMenu.tenant_no == tenant,
  58. ),
  59. )
  60. .join(
  61. SysUserRole,
  62. and_(
  63. SysUserRole.role_id == SysRoleMenu.role_id,
  64. SysUserRole.user_id == user_id,
  65. SysUserRole.del_flag == 0,
  66. SysUserRole.tenant_no == tenant,
  67. ),
  68. )
  69. .filter(
  70. SysMenu.del_flag == 0,
  71. SysMenu.tenant_no == tenant,
  72. SysMenu.status == "1",
  73. SysMenu.visible == "1",
  74. )
  75. .distinct()
  76. )
  77. out: Set[str] = set()
  78. for perms, mid in q.all():
  79. p = (perms or "").strip()
  80. if p:
  81. out.add(p)
  82. elif mid:
  83. out.add(str(mid).strip())
  84. return out
  85. except Exception:
  86. return set()