permission.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. # -*- coding: utf-8 -*-
  2. # @Author : YY
  3. from functools import wraps
  4. from typing import Callable
  5. from flask_login import UserMixin
  6. from ruoyi_common.domain.entity import LoginUser
  7. from ruoyi_common.utils import security_util as SecurityUtil
  8. class PermissionService:
  9. """
  10. 菜单权限
  11. """
  12. # 所有权限标识
  13. ALL_PERMISSION = "*:*:*"
  14. # 管理员角色权限标识
  15. SUPER_ADMIN = "admin"
  16. ROLE_DELIMETER = ","
  17. PERMISSION_DELIMETER = ","
  18. @classmethod
  19. def has_perm(cls, permission:str) -> bool:
  20. """
  21. 验证用户是否具备某权限
  22. Args:
  23. permission (str): 权限标识
  24. Returns:
  25. bool: True:具备该权限,False:不具备该权限
  26. """
  27. if not permission:
  28. return False
  29. login_user:LoginUser = SecurityUtil.get_login_user()
  30. if not login_user:
  31. return False
  32. else:
  33. if not isinstance(login_user, UserMixin):
  34. return False
  35. user_authorities = login_user.permissions
  36. if not user_authorities: return False
  37. return cls.ALL_PERMISSION in user_authorities \
  38. or permission.strip() in user_authorities
  39. @classmethod
  40. def no_perm(cls, permission:str) -> bool:
  41. """
  42. 验证用户是否不具备某权限
  43. Args:
  44. permission (str): 权限标识
  45. Returns:
  46. bool: True:不具备该权限,False:具备该权限
  47. """
  48. return not cls.has_perm(permission)
  49. @classmethod
  50. def any_perm(cls, permissions:str) -> bool:
  51. """
  52. 验证用户是否具备某权限列表中的任意一个权限
  53. Args:
  54. permissions (str): 权限标识列表,多个权限标识以逗号分隔
  55. Returns:
  56. bool: True:具备任意一个权限,False:不具备任何一个权限
  57. """
  58. if not permissions: return False
  59. login_user:LoginUser = SecurityUtil.get_login_user()
  60. if not login_user:
  61. return False
  62. else:
  63. user_authorities = login_user.permissions
  64. if not user_authorities: return False
  65. for permission in permissions.split(cls.PERMISSION_DELIMETER):
  66. if permission.strip() in user_authorities:
  67. return True
  68. return False
  69. @classmethod
  70. def has_role(cls, role:str) -> bool:
  71. """
  72. 验证用户是否具备某角色
  73. Args:
  74. role (str): 角色标识
  75. Returns:
  76. bool: True:具备该权限,False:不具备该权限
  77. """
  78. if not role:
  79. return False
  80. login_user:LoginUser = SecurityUtil.get_login_user()
  81. if not login_user or not login_user.user.roles:
  82. return False
  83. for sys_role in login_user.user.roles:
  84. if sys_role.role_key == cls.SUPER_ADMIN \
  85. or sys_role.role_key == role.strip():
  86. return True
  87. return False
  88. @classmethod
  89. def no_role(cls, role:str) -> bool:
  90. """
  91. 验证用户是否不具备某角色
  92. Args:
  93. role (str): 角色标识
  94. Returns:
  95. bool: True:具备该权限,False:不具备该权限
  96. """
  97. return not cls.has_role(role)
  98. @classmethod
  99. def any_role(cls, roles:str) -> bool:
  100. """
  101. 验证用户是否具备某角色列表中的任意一个角色
  102. Args:
  103. roles (str): 角色标识列表,多个角色标识以逗号分隔
  104. Returns:
  105. bool: True:具备任意一个角色,False:不具备任何一个角色
  106. """
  107. if not roles: return False
  108. login_user:LoginUser = SecurityUtil.get_login_user()
  109. if not login_user or not login_user.user.roles:
  110. return False
  111. for role in roles.split(cls.ROLE_DELIMETER):
  112. for sys_role in login_user.user.roles:
  113. if sys_role.role_key == cls.SUPER_ADMIN \
  114. or sys_role.role_key == role.strip():
  115. return True
  116. return False
  117. class AuthorityCaller:
  118. def __init__(self, value:str) -> None:
  119. self._value = value
  120. def __call__(self) -> bool:
  121. NotImplementedError()
  122. def LoginRequired() -> bool:
  123. """
  124. 验证用户是否登录
  125. Returns:
  126. bool -- True:已登录,False:未登录
  127. """
  128. login_user:LoginUser = SecurityUtil.get_login_user()
  129. if not login_user:
  130. return False
  131. if not login_user.is_authenticated:
  132. return False
  133. return True
  134. class HasPerm(AuthorityCaller):
  135. """
  136. 验证用户是否具备某权限
  137. """
  138. def __call__(self) -> bool:
  139. return PermissionService.has_perm(self._value)
  140. class NoPerm(AuthorityCaller):
  141. """
  142. 验证用户是否不具备某权限
  143. """
  144. def __call__(self) -> bool:
  145. return PermissionService.no_perm(self._value)
  146. class AnyPerm(AuthorityCaller):
  147. """
  148. 验证用户是否具备某权限列表中的任意一个权限
  149. """
  150. def __call__(self) -> bool:
  151. return PermissionService.any_perm(self._value)
  152. class HasRole(AuthorityCaller):
  153. """
  154. 验证用户是否具备某角色
  155. """
  156. def __call__(self) -> bool:
  157. return PermissionService.has_role(self._value)
  158. class NoRole(AuthorityCaller):
  159. """
  160. 验证用户是否不具备某角色
  161. """
  162. def __call__(self) -> bool:
  163. return PermissionService.no_role(self._role)
  164. class AnyRole(AuthorityCaller):
  165. """
  166. 验证用户是否具备某角色列表中的任意一个角色
  167. """
  168. def __call__(self) -> bool:
  169. return PermissionService.any_role(self._role)
  170. class PreAuthorize:
  171. def __init__(self, auth:AuthorityCaller|Callable):
  172. self._auth = auth
  173. def __call__(self, func) -> Callable:
  174. @wraps(func)
  175. def wrapper(*args, **kwargs):
  176. if not callable(self._auth):
  177. raise Exception("权限验证器必须是可调用对象")
  178. if not self._auth():
  179. raise Exception("无访问权限")
  180. return func(*args, **kwargs)
  181. return wrapper