我正在构建一个 DRF API,并希望允许工作人员(
以下是我尝试过的方法:
选项 1:在每个自定义权限上进行检查
有什么想法吗?我希望能够设置一个全局权限检查,当用户是工作人员时返回
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
,否则使用自定义权限。但是阅读了如何确定权限,我不确定这是否可能。