@凯尔已经描述了这个问题,他的答案应该被接受
但我会尝试添加一些细节:
-
当我们链接两个权限类时,DRF会创建一个新的权限类
OR
课程:
>>> from rest_framework.permissions import IsAdminUser
>>> or_class = [IsAdminUser | IsAdminUser]
>>> len(or_class)
1
>>> print(or_class)
[<rest_framework.permissions.OperandHolder object at 0x1096d5fa0>]
>>>
-
德扬戈
documentation
他说
has_object_permission
(检查确切对象的权限)方法在之后运行
has_permission
(检查整个视图类的权限)
-
让我们看看这些方法在内部是如何链接的
或
课程:
>>> import inspect
>>> or_instance = or_class[0]()
>>> print(inspect.getsource(or_instance.has_permission))
def has_permission(self, request, view):
return (
self.op1.has_permission(request, view) or
self.op2.has_permission(request, view)
)
>>> print(inspect.getsource(or_instance.has_object_permission))
def has_object_permission(self, request, view, obj):
return (
self.op1.has_object_permission(request, view, obj) or
self.op2.has_object_permission(request, view, obj)
)
所以我们可以看到DRF检查了这两个
你有许可吗
然后我们两个
拥有_object _权限
你有许可吗
检查可能会被跳过,因为我们正在运行
拥有_object _权限
之后
但是
拥有_object _权限
没有在内部实现
IsAdminUser
权限类,但它是在父类中实现的
BasePermission
类,看起来像:
class BasePermission(metaclass=BasePermissionMetaclass):
def has_object_permission(self, request, view, obj):
return True
所以
艾德明
总是回来
True
在…上
拥有_object _权限
.通常情况下
艾德明
应该失败
你有许可吗
,但在你的
或
班
你有许可吗
已通过,因为它未在内部实现
AccountOwnerPermission
班
最简单的解决方案是添加
你有许可吗
方法
帐户所有者权限
课程:
class AccountOwnerPermission(permissions.BasePermission):
def has_permission(self, request, view, obj):
return False