我想弄清楚,用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, ]
如果查询依赖于用户,这一点非常重要。