私信  •  关注

Kyell

Kyell 最近创建的主题
Kyell 最近回复了
3 年前
回复了 Kyell 创建的主题 » Django rest framework视图集中的chainig权限

当链接权限时,例如

permission_classes = [AccountOwnerPermission, IsAdminUser]

它的行为类似于权限类之间的AND运算符

最好的选择是创建一个新的权限,该权限允许权限逻辑。

class AdminOrAccountOwnerPermission(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        return obj == request.user or request.user.id_admin

或者,当使用的权限具有长而复杂的代码以保持代码干燥时:

class AdminOrAccountOwnerPermission(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        return AccountOwnerPermission().has_object_permission(request, view, obj) or IsAdminUser().has_object_permission(request, view, obj)

编辑: 请回答评论中的问题,说明其行为的原因 AllowAny . AccountOwnerPermission has_object_permission 但是没有 has_permission 另一方面 IsAdminUser 你有许可吗 但是没有 拥有_object _权限 实施。

当这些函数未实现时,函数返回 True 默认情况下(从 BasePermission ).因此,在跑步时 你有许可吗 , 帐户所有者权限 总是回来 符合事实的 跑步时 拥有_object _权限 , 艾德明 他总是回来 符合事实的 .

实施 AccountOwnerPermission.has_permission 将给出预期的行为。