【问题标题】:Django Rest Framework: Permissions based on Object Attributes/OwnershipDjango Rest Framework:基于对象属性/所有权的权限
【发布时间】:2014-05-31 21:58:54
【问题描述】:

我希望允许用户创建和查看资源,但前提是:

  1. 他们是员工或
  2. 他们是他们尝试创建/查看的对象的“所有者”

我已经获得了只读权限,因为用户只有在使用主键生成视图集时才有权获取对象列表。例如:GET /api/users/1/notes 只返回 pk=1 的用户的注释。

但是,在测试中,我发现用户可以通过将对象发布到他们自己的列表端点来创建另一个用户“拥有”的对象。例如,用户 1 可以向 /api/users/1/notes 发送 POST,但将便笺数据指定为 {user: "http://host.tld/users/2/", text: "看!我在另一个人的帐户中创建了一个便笺!"}

我在下面有一个修复程序,似乎工作正常,但我觉得我正在逆流而上。现在,在自定义权限内,我创建了将要创建的对象的一个​​实例,并检查其所有者是否是发出请求的用户。

有更简洁的方法吗?

当前修复:

def has_permission(self, request, view):
    if request.user.is_staff:
        return True
    elif request.method in permissions.SAFE_METHODS:
        # check that the user is looking for their own list
        return request.user == User.objects.get(pk=view.kwargs['user_pk'])
    elif request.method not in permissions.SAFE_METHODS:
        # the user can create/modify the object if the new object's user == the request user
        # roundabout way of figuring this out... probably a better way
        user_path = request.POST['user'].split(request.get_host())[1]
        func = resolve(user_path).func
        kwargs = resolve(user_path).kwargs
        user_for_object = func.cls.model.objects.get(pk=kwargs['pk'])
        return user_for_object == request.user
    else:
        return False

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    这取决于您的代码的其余部分。

    通常 DRF 在您的 ViewSet 或权限后端中的一个名为 check_object_permissions 的方法中进行对象级检查。

    get_object 的(默认实现)调用此方法,以在任何泛型尝试获取要处理的对象时检查权限。

    如果您只使用通用视图集并且/notes@action,这将是最简单的方法。

    如果这些 ViewSet 中的 objectnote,我建议构建一些看起来相似的东西(例如,在你添加到位于 /user/ 下的每个 ViewSet 的 mixin 中)。 有许多不同的方法来构建嵌套资源及其路由。

    【讨论】:

      猜你喜欢
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 2017-05-04
      相关资源
      最近更新 更多