permission.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import re
  2. from django.contrib.auth.models import AnonymousUser
  3. from django.db.models import F
  4. from rest_framework.permissions import BasePermission
  5. from dvadmin.system.models import ApiWhiteList
  6. def ValidationApi(reqApi, validApi):
  7. """
  8. 验证当前用户是否有接口权限
  9. :param reqApi: 当前请求的接口
  10. :param validApi: 用于验证的接口
  11. :return: True或者False
  12. """
  13. if validApi is not None:
  14. valid_api = validApi.replace('{id}', '.*?')
  15. matchObj = re.match(valid_api, reqApi, re.M | re.I)
  16. if matchObj:
  17. return True
  18. else:
  19. return False
  20. else:
  21. return False
  22. class AnonymousUserPermission(BasePermission):
  23. """
  24. 匿名用户权限
  25. """
  26. def has_permission(self, request, view):
  27. if isinstance(request.user, AnonymousUser):
  28. return False
  29. return True
  30. def ReUUID(api):
  31. """
  32. 将接口的uuid替换掉
  33. :param api:
  34. :return:
  35. """
  36. pattern = re.compile(r'[a-f\d]{4}(?:[a-f\d]{4}-){4}[a-f\d]{12}/$')
  37. m = pattern.search(api)
  38. if m:
  39. res = api.replace(m.group(0), ".*/")
  40. return res
  41. else:
  42. return None
  43. class CustomPermission(BasePermission):
  44. """自定义权限"""
  45. def has_permission(self, request, view):
  46. if isinstance(request.user, AnonymousUser):
  47. return False
  48. # 判断是否是超级管理员
  49. if request.user.is_superuser:
  50. return True
  51. else:
  52. api = request.path # 当前请求接口
  53. method = request.method # 当前请求方法
  54. methodList = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'PATCH']
  55. method = methodList.index(method)
  56. # ***接口白名单***
  57. api_white_list = ApiWhiteList.objects.values(permission__api=F('url'), permission__method=F('method'))
  58. api_white_list = [
  59. str(item.get('permission__api').replace('{id}', '([a-zA-Z0-9-]+)')) + ":" + str(
  60. item.get('permission__method')) + '$' for item in api_white_list if item.get('permission__api')]
  61. # ********#
  62. if not hasattr(request.user, "role"):
  63. return False
  64. userApiList = request.user.role.values('permission__api', 'permission__method') # 获取当前用户的角色拥有的所有接口
  65. ApiList = [
  66. str(item.get('permission__api').replace('{id}', '([a-zA-Z0-9-]+)')) + ":" + str(
  67. item.get('permission__method')) + '$' for item in userApiList if item.get('permission__api')]
  68. new_api_ist = api_white_list + ApiList
  69. new_api = api + ":" + str(method)
  70. for item in new_api_ist:
  71. matchObj = re.match(item, new_api, re.M | re.I)
  72. if matchObj is None:
  73. continue
  74. else:
  75. return True
  76. else:
  77. return False
  78. class SuperuserPermission(BasePermission):
  79. """
  80. 超级管理员权限类
  81. """
  82. def has_permission(self, request, view):
  83. if isinstance(request.user, AnonymousUser):
  84. return False
  85. # 判断是否是超级管理员
  86. if request.user.is_superuser:
  87. return True
  88. class AdminPermission(BasePermission):
  89. """
  90. 普通管理员权限类
  91. """
  92. def has_permission(self, request, view):
  93. if isinstance(request.user, AnonymousUser):
  94. return False
  95. # 判断是否是超级管理员
  96. is_superuser = request.user.is_superuser
  97. # 判断是否是管理员角色
  98. is_admin = request.user.role.values_list('admin', flat=True)
  99. if is_superuser or True in is_admin:
  100. return True