【问题标题】:django rest permissions allow both IsAdmin and custom permissiondjango rest 权限同时允许 IsAdmin 和自定义权限
【发布时间】:2018-01-15 17:18:17
【问题描述】:

我有一个views.py如下,

from webapi.permissions import IsOwner

class MemberDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = members.objects.all()
    serializer_class = MemberSerializer
    permission_classes = (permissions.IsAdminUser,IsOwner)

以下是自定义权限,用于检查用户是否是webapi.permissions中对象的所有者,

class IsOwner(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
            return obj.owner == request.user

现在的问题是检查他是否是管理员用户并授予更新/删除权限,但如果所有者是用户,它实际上应该授予编辑他的数据的权限,但在这种情况下它失败了。

在看到问题“Django Rest Framework won't let me have more than one permission”时,我尝试如下,但在使用 Or 时仍然无法正常工作,

class MemberDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = members.objects.all()
    serializer_class = MemberSerializer
    permission_classes = (Or(permissions.IsAdminUser,IsOwner))

如果我使用 Or 它在运行时失败并出现错误,因为“'Condition' object is not iterable”

【问题讨论】:

标签: django django-rest-framework django-authentication


【解决方案1】:

由于 DRF 3.9,您可以使用逻辑位运算符 |&~ 已添加到 3.9.2)。

正如the docs 中所述,您只需要

    permission_classes = (permissions.IsAdminUser|IsOwner,)

【讨论】:

    【解决方案2】:

    如果您只需要为管理员和所有者用户授予编辑权限,您可以实现自定义权限类:

    class IsOwnerOrAdmin(permissions.BasePermission):
        def has_object_permission(self, request, view, obj):
            if request.method in permissions.SAFE_METHODS:
                return True
            return obj.owner == request.user or request.user.is_admin
    

    并且在视图中只使用这个:

    permission_classes = [IsOwnerOrAdmin]
    

    此方法记录在here

    【讨论】:

    • 这以更好的方式工作,我已删除 Or 并使用自定义权限。
    • 如果有人只是复制此代码,请注意,按原样编写也会为任何人提供只读访问权限,而不仅仅是所有者或管理员(SAFE_METHODS 检查)。
    【解决方案3】:

    您正在使用元组语法,但您需要逗号来充当元组
    替换
    permission_classes = (Or(permissions.IsAdminUser,IsOwner))

    permission_classes = (Or(permissions.IsAdminUser,IsOwner), )

    【讨论】:

    • 是的,这没有给出任何错误,但现在仍然任何人都可以编辑它意味着 Permissions.IsAdminUser 和 IsOwser 没有生效
    • 你用的是哪个Or,rest框架没有内置条件
    • 我使用 pip 安装并使用模块 "from rest_condition import Or" , module "pypi.python.org/pypi/rest_condition"
    • 现在有什么问题,任何人都可以编辑或没有人可以编辑现在哪个班级正在行动?
    猜你喜欢
    • 2020-09-16
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2020-10-10
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多