【发布时间】:2019-08-16 23:50:18
【问题描述】:
我正在构建一个 DRF API,我希望允许工作人员 (is_staff == True) 访问所有 REST 端点,同时仍为每个 ViewSet 提供自定义权限检查。理想情况下,这将是一个全局设置,但我不反对按 ViewSet 进行设置。
这是我尝试过的事情:
选项 1:检查每个自定义权限
from rest_framework import permissions
class SomeModelPermission(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.is_staff:
return True
# other logic
def has_object_permission(self, request, view, obj):
if request.user.is_staff:
return True
# other logic
这可行,但我不想重复这么多代码。
选项 2:按位运算符
我尝试从上面的自定义权限中删除 is_staff 逻辑,并将其添加到 ViewSet:
from rest_framework import permissions, viewsets
class SomeModelViewSet(viewsets.ModelViewSet):
permission_classes = (permissions.IsAdminUser|SomeModelPermission,)
但是,这实际上并没有按照我的意愿强制执行权限,因为IsAdminUser 继承自BasePermission,其定义为:
class BasePermission(object):
def has_permission(self, request, view):
return True
def has_object_permission(self, request, view, obj):
return True
IsAdminUser没有定义自己的has_object_permission,所以在检查对象权限的时候总会返回True,导致意外的对象访问。
有什么想法吗?我希望有某种方法可以设置全局权限检查,当用户是员工时返回True,否则遵循自定义权限。但是通过how permissions are determined阅读,我不确定这是否可能。
【问题讨论】:
标签: python django permissions django-rest-framework