Django Rest Framework 不会让我拥有多个权限

Pro*_*eus 8 python django django-rest-framework

我的 Django Rest Framework 和权限有问题。例如,DRF 不会让我对我的视图拥有多个权限。

如果我以管理员用户身份登录 API,则可以使用以下 mixin 访问:

class PermissionMixin(object):
    permission_classes = (permissions.IsAdminUser)
Run Code Online (Sandbox Code Playgroud)

现在,如果我添加第二个权限 mixin:

class PermissionMixin(object):
    permission_classes = (permissions.IsAdminUser, TokenHasReadWriteScope)
Run Code Online (Sandbox Code Playgroud)

管理员用户被拒绝访问。应该发生的是管理员用户和具有令牌的用户都可以访问,但是现在只有 TokenHasReadWriteScope 用户可以访问。

有没有其他人遇到过这个问题,这是怎么回事?

我需要两种类型的用户都可以访问。

这是我的观点:

class SomeList(PermissionMixin, generics.ListCreateAPIView)

    queryset = Award.objects.all()
    serializer_class = AwardSerializer
Run Code Online (Sandbox Code Playgroud)

PS TokenHasReadWriteScope 来自django-oauth-toolkit

Nem*_*man 26

Django Rest Framework 3.9 及更高版本中,它们内置了对可组合权限类的支持,您可以开箱即用地使用和/或运算符:

permission_classes = [IsAuthenticated & (ReadOnly | IsAdmin)]
Run Code Online (Sandbox Code Playgroud)


Ade*_*laN 9

您遇到的行为绝对正常,这就是 DRF 的设计方式。如果您希望至少拥有这些权限类别中的一个,则需要指定一个更“复杂”的条件。是您可能使用的一个很好的例子。安装后,您可以像这样使用它:

from rest_condition import Or
...
permission_classes = (Or(permissions.IsAdminUser, TokenHasReadWriteScope),)
Run Code Online (Sandbox Code Playgroud)

  • 我不知道是这样的。谢谢。这是在哪里记录的? (2认同)
  • 不幸的是,我不知道它在哪里记录。根据我的个人经验,我知道 DRF 按特定顺序应用所有权限类别。我给你的链接是我遇到像你一样的问题时发现的。另一种可能的解决方案是编写您自己的权限类,在其中检查这两个权限中至少有一个为真。 (2认同)
  • 令人难以置信的是,这不是内置的......我觉得对权限进行“与”然后对它们进行“或”的用例较少。无论哪种方式,您都可以从这里获取:https://github.com/caxap/rest_condition (2认同)