123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- import re
- from django.contrib.auth.models import AnonymousUser
- from django.db.models import F
- from rest_framework.permissions import BasePermission
- from dvadmin.system.models import ApiWhiteList
- def ValidationApi(reqApi, validApi):
- """
- 验证当前用户是否有接口权限
- :param reqApi: 当前请求的接口
- :param validApi: 用于验证的接口
- :return: True或者False
- """
- if validApi is not None:
- valid_api = validApi.replace('{id}', '.*?')
- matchObj = re.match(valid_api, reqApi, re.M | re.I)
- if matchObj:
- return True
- else:
- return False
- else:
- return False
- class AnonymousUserPermission(BasePermission):
- """
- 匿名用户权限
- """
- def has_permission(self, request, view):
- if isinstance(request.user, AnonymousUser):
- return False
- return True
- def ReUUID(api):
- """
- 将接口的uuid替换掉
- :param api:
- :return:
- """
- pattern = re.compile(r'[a-f\d]{4}(?:[a-f\d]{4}-){4}[a-f\d]{12}/$')
- m = pattern.search(api)
- if m:
- res = api.replace(m.group(0), ".*/")
- return res
- else:
- return None
- class CustomPermission(BasePermission):
- """自定义权限"""
- def has_permission(self, request, view):
- if isinstance(request.user, AnonymousUser):
- return False
- # 判断是否是超级管理员
- if request.user.is_superuser:
- return True
- else:
- api = request.path # 当前请求接口
- method = request.method # 当前请求方法
- methodList = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'PATCH']
- method = methodList.index(method)
- # ***接口白名单***
- api_white_list = ApiWhiteList.objects.values(permission__api=F('url'), permission__method=F('method'))
- api_white_list = [
- str(item.get('permission__api').replace('{id}', '([a-zA-Z0-9-]+)')) + ":" + str(
- item.get('permission__method')) + '$' for item in api_white_list if item.get('permission__api')]
- # ********#
- if not hasattr(request.user, "role"):
- return False
- userApiList = request.user.role.values('permission__api', 'permission__method') # 获取当前用户的角色拥有的所有接口
- ApiList = [
- str(item.get('permission__api').replace('{id}', '([a-zA-Z0-9-]+)')) + ":" + str(
- item.get('permission__method')) + '$' for item in userApiList if item.get('permission__api')]
- new_api_ist = api_white_list + ApiList
- new_api = api + ":" + str(method)
- for item in new_api_ist:
- matchObj = re.match(item, new_api, re.M | re.I)
- if matchObj is None:
- continue
- else:
- return True
- else:
- return False
- class SuperuserPermission(BasePermission):
- """
- 超级管理员权限类
- """
- def has_permission(self, request, view):
- if isinstance(request.user, AnonymousUser):
- return False
- # 判断是否是超级管理员
- if request.user.is_superuser:
- return True
- class AdminPermission(BasePermission):
- """
- 普通管理员权限类
- """
- def has_permission(self, request, view):
- if isinstance(request.user, AnonymousUser):
- return False
- # 判断是否是超级管理员
- is_superuser = request.user.is_superuser
- # 判断是否是管理员角色
- is_admin = request.user.role.values_list('admin', flat=True)
- if is_superuser or True in is_admin:
- return True
|