【问题标题】:Django Rest Framework won't let me have more than one permissionDjango Rest Framework 不会让我拥有多个权限
【发布时间】:2014-09-13 02:07:37
【问题描述】:

我对 Django Rest 框架和权限有疑问。例如,DRF 不会让我对自己的观点拥有超过一项权限。

如果我以管理员用户身份登录 API,我可以使用这个 mixin 获得访问权限:

class PermissionMixin(object):
    permission_classes = (permissions.IsAdminUser)

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

class PermissionMixin(object):
    permission_classes = (permissions.IsAdminUser, TokenHasReadWriteScope)

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

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

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

这是我的视图:

class SomeList(PermissionMixin, generics.ListCreateAPIView)

    queryset = Award.objects.all()
    serializer_class = AwardSerializer

PS TokenHasReadWriteScope 来自django-oauth-toolkit

【问题讨论】:

  • 我想你做了“从 oauth2_provider.ext.rest_framework 导入 TokenHasReadWriteScope”?!控制台中的错误是什么样的?
  • @wagner-felix 您好,感谢您的回复。是的,我已正确导入。完全没有错误。

标签: python django django-rest-framework


【解决方案1】:

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

from rest_condition import Or
...
permission_classes = (Or(permissions.IsAdminUser, TokenHasReadWriteScope),)

【讨论】:

  • 我不知道会是这样。谢谢你。这是在哪里记录的?
  • rest_condition 不存在。这是从哪里进口的?
  • 不幸的是,我不知道它记录在哪里。我从个人经验中知道,DRF 按特定顺序应用所有权限类。我给你的链接是我在遇到和你一样的问题时发现的。另一种可能的解决方案是编写自己的权限类,在其中检查这两个权限中的至少一个是否为真。
  • 我明白了。我试了一下。感谢您的帮助。
  • 令人难以置信的是,这不是内置的......我觉得与权限的用例比对权限的用例少。无论哪种方式,您都可以从这里获得它:github.com/caxap/rest_condition
【解决方案2】:

使用version 3.9 and above of Django Rest Framework,它们内置了对可组合权限类的支持,您可以开箱即用地使用和/或运算符:

permission_classes = [IsAuthenticated & (ReadOnly | IsAdmin)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2016-06-17
    • 1970-01-01
    • 2018-11-11
    相关资源
    最近更新 更多