【问题标题】:Django Rest Framework permissions of POST objectPOST 对象的 Django Rest Framework 权限
【发布时间】:2014-06-19 12:00:30
【问题描述】:

我正在为使用 HyperlinkeRelatedFields 等的超链接序列化程序实现自定义权限类。

检查很粗略:

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

    if not request.user.is_authenticated():
        return False

    if request.user.is_staff:
        return True

    # POST: 'author' is a URL due to serializer being Hyperlinked
    # meaning we have to translate URL to model (like the serializer)
    # to perform the check
    if url_to_user(request.DATA['author']) == request.user:
        return True

鉴于代码中的注释,似乎让序列化程序在验证期间执行此检查可能会更好,尽管这会转移问题。这几乎就像验证类需要一个在调用 save() 之前传递新对象的方法,以从权限的角度检查 POST/PUT 是否可接受,而不是将 HTTP/权限相关的检查塞入验证中序列化器。

url_to_user 是特定于序列化的,并且在序列化程序的验证器部分中的检查将是特定于 request/http 的,而不仅仅是新模型的健全性/完整性检查。

这似乎是一件很常见的事情,所以我很好奇其他人采取了哪条路线,以及我是否缺少“更正确”的方法。

提前致谢。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    鉴于评论说POST,我假设它只是创建您正在处理的新对象。

    由于author 必须是request.user,因此无需将其作为可写字段。我只是将对象的作者属性设置为pre_save 中的当前用户。

    同样,如果您想处理PUT,您也可以将QuerySet 限制为当前用户:

    def get_queryset(self):
      return MyClass.objects.filter(author=self.request.user)
    

    (查看request.method in permissions.SAFE_METHODS您可能需要根据请求方法执行此操作...)

    这样一来,用户就不能创建不附加到自己的对象,也不能更新他们尚未拥有的对象。

    但是,一如既往,TIMTOWTDI;基于权限的路由没有任何问题。 (我不确定这里是否有最终答案。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 2018-06-25
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多