python – Django Rest Framework:基于对象属性/所有权的权限
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – Django Rest Framework:基于对象属性/所有权的权限,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1734字,纯文字阅读大概需要3分钟。
内容图文
![python – Django Rest Framework:基于对象属性/所有权的权限](/upload/InfoBanner/zyjiaocheng/779/628b8815bdc14ee1a6f773de14624075.jpg)
我想允许用户创建和查看资源,但仅限于:
>他们是工作人员或
>他们是他们试图创建/查看的对象的“所有者”
我已经获得了只读权限,因为用户只有在使用主键生成视图集时才能获取对象列表.例如:GET / api / users / 1 / notes仅返回pk = 1的用户注释.
但是,在测试中,我发现用户可以通过将其发布到自己的列表端点来创建另一个用户“拥有”的对象.例如,用户1可以向/ api / users / 1 / notes发送POST,但是将注释数据指定为{user:“http://host.tld/users/2/”,text:“Look!我在另一个人的帐户中创建了一个注释!”}
我有一个下面似乎工作得很好的修复,虽然我感觉我正在逆流而行.现在,在自定义权限内,我创建了一个将要创建的对象的实例,并检查其所有者是否是发出请求的用户.
这样做有更干净的方法吗?
当前修复:
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
解决方法:
这取决于你的其余代码.
通常,DRF在ViewSet或权限后端中的一个名为check_object_permissions的方法中进行对象级别检查.
此方法由(默认实现)get_object调用,以在任何泛型尝试使对象工作时检查权限.
如果你只使用Generic ViewSets和/ notes是@action,这将是最简单的方法.
如果这些ViewSets中的对象是注释,我建议构建类似的东西(例如,在添加到/ user /下的每个ViewSet的mixin中).
有许多不同的方法来构建嵌套资源及其路由.
内容总结
以上是互联网集市为您收集整理的python – Django Rest Framework:基于对象属性/所有权的权限全部内容,希望文章能够帮你解决python – Django Rest Framework:基于对象属性/所有权的权限所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。