我正在为使用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特定的,而不仅仅是对新模型的完整性/完整性检查。
这似乎是一件很平常的事情,我很好奇其他人采取了什么路线,以及是否有更正确的"接近我失踪。
提前致谢。
答案 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一样;基于权限的路由没有任何问题。 (我不确定这里有最终答案。)