mgo*_*ohn 5 python django django-rest-framework
我想允许用户创建和查看资源,但前提是:
我已经获得了只读权限,效果很好,因为用户只有在使用主键生成视图集时才有权获取对象列表。例如: GET /api/users/1/notes 仅返回 pk=1 的用户的注释。
然而,在测试中,我发现用户可以通过将另一个用户“拥有”的对象发布到自己的列表端点来创建该对象。例如,用户 1 可以发送 POST 到 /api/users/1/notes,但将注释数据指定为 {user: " http://host.tld/users/2/ ", text: "Look! I create a在另一个人的帐户中注明!”}
我在下面找到了一个似乎工作正常的修复程序,尽管我感觉自己正在逆流而上。现在,在自定义权限内,我创建将要创建的对象的实例,并检查其所有者是否是发出请求的用户。
有没有更干净的方法来做到这一点?
当前修复:
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
Run Code Online (Sandbox Code Playgroud)
这取决于您的其余代码。
check_object_permissions通常,DRF 在您的或权限后端调用的方法中进行对象级检查ViewSet。
get_object当任何泛型尝试获取要处理的对象时,(默认实现)会调用此方法来检查权限。
如果您仅使用通用视图集,那么/notes这@action将是最简单的方法。
如果这些 ViewSet 中的对象是note,我建议构建一些看起来相似的东西(例如,在 mixin 中添加到位于 下的每个 ViewSet 中/user/)。有许多不同的方法来构建嵌套资源及其路由。
| 归档时间: |
|
| 查看次数: |
1616 次 |
| 最近记录: |