【发布时间】:2020-12-18 23:41:41
【问题描述】:
我尝试通过装饰器类在 Django 中实现权限。 在那里我检查用户是否已通过身份验证以及用户具有什么角色(ADMIN,HQ_ADMIN,...)
这是我的代码:
class UserPermissions(permissions.BasePermission):
def has_permission(self, request, view):
if not request.user and request.user.is_authenticated():
return False
method = request.method
authenticator = request._authenticator
response = self.check_permission_roles(request)
if(response == None):
if method == 'POST' and isinstance(authenticator, BasicAuthentication):
return True
if method == 'PUT' and isinstance(authenticator, BasicAuthentication):
return True
if method == 'DELETE' and isinstance(authenticator, BasicAuthentication):
return True
if method == 'GET':
return True
return False
def check_permission_roles(self, request):
""" checks the roles from the logged-in user """
headers = {'Access-Control-Allow-Origin':'*'}
logged_in_user_roles = request.user.roles
new_roles = request.DATA[models.ROLES]
# check roles for create ADMIN
if models.ADMIN in new_roles:
if models.ADMIN not in logged_in_user_roles:
return Response("no right to create role: ADMIN", status=400, headers=headers)
# check roles for create HQ_ADMIN
if models.HQ_ADMIN in new_roles:
if models.ADMIN not in logged_in_user_roles:
if models.HQ_ADMIN not in logged_in_user_roles:
return Response("no right to create role: HQ_ADMIN", status=400, headers=headers)
# check roles for create HQ_USER
if models.HQ_USER in new_roles:
if models.ADMIN not in logged_in_user_roles:
if models.HQ_ADMIN not in logged_in_user_roles:
return Response("no right to create role: HQ_USER", status=400, headers=headers)
# check roles for create WORKSHOP_USER
if models.WORKSHOP_USER in new_roles:
if models.ADMIN not in logged_in_user_roles:
if models.HQ_ADMIN not in logged_in_user_roles:
if models.HQ_USER not in logged_in_user_roles:
return Response("no right to create role: WORKSHOP_USER", status=400, headers=headers)
# check roles for create DRIVER
if models.DRIVER in new_roles:
if models.ADMIN not in logged_in_user_roles:
if models.HQ_ADMIN not in logged_in_user_roles:
if models.HQ_USER not in logged_in_user_roles:
if models.WORKSHOP_USER not in logged_in_user_roles:
return Response("no right to create role: DRIVER", status=400, headers=headers)
return None
如果我现在发送一个 post 命令,并且 check_permission_roles 方法返回不是 None,我希望 Django 发送从 check_permission_roles 函数返回的响应而不是标准响应(403,您没有执行此操作的权限。) .
如何防止 Django 返回默认响应,而是返回自定义响应?
【问题讨论】:
标签: python django django-rest-framework