【问题标题】:Django Rest Framework and permissionsDjango Rest 框架和权限
【发布时间】:2017-04-13 22:56:40
【问题描述】:

我已经阅读了几个 StackOverflow 线程,但没有找到任何令人满意的解决方案。 我想要几个自定义权限,它们或多或少复杂(从 ReadOnly 到 limit by-user ...)。

让我们从我现在拥有的开始:

  • 基类,只读
  • 我的设置
  • 用户的视图集。
  • 还有一个 staff_user,让我们折叠一切

我的基类看起来像:

class ReadOnly(permissions.BasePermission):
    """
    Only, always, ever allow read-only access.
    """

    def has_permission(self, request, view):
        if request.method in permissions.SAFE_METHODS:
            return True

        return False

并因此被示例用户的视图集内化

class UserViewSet(viewsets.ModelViewSet):
    """
    Retrieve the user associated with your session and allow all methods.
    """
    serializer_class = UserSerializer
    permission_classes = (ReadOnly,)

    def get_queryset(self):
        return User.objects.filter(id=self.request.user.id) # This should return an empty queryset when not logged in

并且适当的后备默认权限是

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'api.permissions.ReadOnly'
    ]
}

当我现在访问用户页面并以员工身份登录时,我可以通过 POST 轻松创建用户,这同样适用于我的所有其他视图集。这里发生了什么?

【问题讨论】:

  • 您在此处粘贴的代码确实工作正常。

标签: python-3.x permissions django-rest-framework


【解决方案1】:

我对这个问题有更深入的了解.. 所以,这是我的更复杂权限的代码:

class IsCurrentUserOrDeny(permissions.BasePermission):
"""
Allow the current user to edit his own user object
"""

def has_object_permission(self, request, view, obj):
    return False
    if request.method in permissions.SAFE_METHODS:
        return obj == request.user

    return False

def has_permission(self, request, view):
    return True

显然,使用 ModelViewSet 不会查找 has_object_permissions 方法。将 has_permissions 更改为 False 会拒绝所有请求(如预期的那样)。文档告诉

注意:实例级别的 has_object_permission 方法只有在视图级别的 has_permission 检查已经通过时才会被调用。另请注意,为了运行实例级检查,视图代码应显式调用 .check_object_permissions(request, obj)。如果您使用的是通用视图,则默认情况下会为您处理。

由于 ModelViewSet 是一个从 GenericViewApi 中提取的组合类,因此预期的行为将是:

  • 检查 has_permissions 是否返回 True
  • => 检查 has_object_permissions 是否返回 True

但实际上并非如此。这里有什么问题?

【讨论】:

    猜你喜欢
    • 2019-07-13
    • 2016-11-20
    • 2014-08-25
    • 2016-01-25
    • 1970-01-01
    • 2018-11-19
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多