【问题标题】:Django REST Framework: restrict data records access to the users created themDjango REST Framework:限制对创建它们的用户的数据记录访问
【发布时间】:2013-12-30 00:56:46
【问题描述】:

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

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

我是否必须创建多个表,或者是否可以只使用一个表来实现? 如果我必须使用多个表,如何将 API 请求与特定表关联起来?

【问题讨论】:

    标签: django django-rest-framework user-permissions database-permissions


    【解决方案1】:

    使用 django-rest-framework 和 django-rest-auth,我必须执行 Lucas Weyne 对this question 的回答中所述的其他步骤。

    这是他建议的对我有用的方法。

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

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

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

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

    permission_classes = [permissions.IsAuthenticated, ]
    

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

    【讨论】:

      【解决方案2】:

      好的,我找到了一种通过 API 和管理员来完成的方法。这基本上类似于 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
      

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

      【讨论】:

      • 这证明了 DRF 的文档有多么有用。
      【解决方案3】:

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

      【讨论】:

      • 您能说得更具体些吗?比如您将如何生成该字段以及在发送 HTTP 请求时如何准确地比较用户?
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2014-12-18
        • 2016-04-23
        • 1970-01-01
        • 2012-11-15
        • 2016-04-04
        • 2016-03-11
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        相关资源
        最近更新 更多