Django REST框架:限制创建数据记录的用户访问数据记录



我想弄清楚,用Django管理模型访问权限的最佳方式是什么。

我有一个项目表,这些项目属于创建它们的用户。通过RESTful API管理的所有项目。当使用这个API时,我想限制对给定用户创建的项的访问。

我必须创建多个表吗?或者只需要一个表就可以实现同样的目的吗?如果必须使用多个表,如何将API请求与特定表关联起来?

好的,我找到了一种通过API和admin实现这一点的方法。这基本上类似于Rob的想法。

首先,每次我通过管理面板创建新用户时,我都需要在我的项目中添加一个用户:

class MyAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        if getattr(obj, 'user', None) is None:
            obj.user = request.user
        obj.save()
admin.site.register(MyItem, MyAdmin)

然后,当访问我的模型时,我只按用户进行筛选(这是django.contrib.auth.models.user的外键):

MyItem.objects.filter(user=request.user)

最后,为了使它与Django REST框架一起工作,我需要向我的自定义ModelViewSet:添加几个方法

class MyItemViewSet(viewsets.ModelViewSet):
    model = MyItem
    serializer_class = MyItemSerializer
    def get_queryset(self):
        return MyItem.objects.filter(user=self.request.user)
    def pre_save(self, obj):
        obj.user = self.request.user

我使用了文档和(大量)试错来解决这个问题。

如果您想要通用对象级权限,那么您可以使用像django-guardian这样的权限后端,下面是与django-restframework 集成的示例

对象上可以有一个created_by字段。然后将django user与之进行比较。如果没有具体的例子,这是一个有点困难的帮助。

使用django-rest框架和django-rest-auth,我必须执行Lucas Weyne对这个问题的回答中描述的额外步骤。

以下是他提出的对我有效的建议。

请确保在请求中包含授权令牌:

curl -H "Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b" <url>

这是关键,因为否则服务器不知道用户是谁

将其添加到您的视图集定义中:

permission_classes = [permissions.IsAuthenticated, ]

如果查询依赖于用户,这一点非常重要。

相关内容

  • 没有找到相关文章

最新更新