Django Rest Framework POST对象的权限

时间:2014-06-19 12:00:30

标签: python django django-rest-framework

我正在为使用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是否可接受,而不是cram HTTP / permissions相关的检查在序列化器中进行验证。

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

这似乎是一件很平常的事情,我很好奇其他人采取了什么路线,以及是否有更正确的"接近我失踪。

提前致谢。

1 个答案:

答案 0 :(得分:0)

鉴于评论说POST,我认为这只是你正在处理的新对象的创建。

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

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

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

(根据请求方法查看request.method in permissions.SAFE_METHODS您可能需要这样做...)

这样,用户无法创建未附加到自身的对象,也无法更新他们尚未拥有的对象。

然而,和TIMTOWTDI一样;基于权限的路由没有任何问题。 (我不确定这里有最终答案。)