【问题标题】:Problems with Django rest-framework DjangoModelPermissions allowing any authenticated userDjango rest-framework DjangoModelPermissions 的问题允许任何经过身份验证的用户
【发布时间】:2014-09-02 16:09:09
【问题描述】:

我正在尝试使用 DjangoModelPermissions,但它似乎无法正常工作。

这是代码:

class TestViewSet(viewsets.ModelViewSet):
    model = Test
    serializer_class = serializers.TestSerializer
    permission_classes = (permissions.DjangoModelPermissions,)

    def create(self, request):
        response_data = {}
        response_data['type'] = 'error'
        data=json.loads(request.raw_post_data)

        test = Test.objects.create(name=data['name'],\
                                            description=data['description'],\
                                            start_date=data['start_date'],\
                                            end_date=data['end_date'])          

        #save changes
        test.save()
        return Response({'status': 'ok', "result": test.id})

我认为在这种情况下没有任何区别,但我使用的是 django_mongodb_engine。

我有一个没有权限的用户,它能够创建测试实例。另一方面,我怎样才能阻止 GET 以便只有具有正确权限的用户才能执行该操作?

谢谢

【问题讨论】:

  • 您是否安装了 django-guardian 或其他后端之类的东西??
  • 不,django-rest-framework 应该负责 API 的安全性
  • 4 年后我遇到了同样的问题 :) 有人找到解决方案吗?

标签: django django-rest-framework django-mongodb-engine


【解决方案1】:

DjangoModelPermissions 在这里不起作用的原因在 DRF 文档中有明确说明

“此权限只能应用于具有 .queryset 属性或 get_queryset() 方法的视图。”

Check the docs here

解决办法是:

将查询集添加到您的模型

class TestViewSet(viewsets.ModelViewSet):
   serializer_class = serializers.TestSerializer
   permission_classes = (permissions.DjangoModelPermissions,)
   queryset = Test.objects.all()

或者如果您想覆盖默认的查询集方法,请随意使用此方法

 def get_queryset(self):
    return super().get_queryset()

另外,我注意到您不必在 ModelViewSet 中指定模型。如果您在 TestSerializer 中指定您的测试模型,您只需在 ModelViewSet 中指定序列化程序,这就是 DRF 的工作方式

【讨论】:

    【解决方案2】:

    我的问题是一样的。尽管有权限类,用户仍可以在数据库中创建新实例。我查看了 django-guardian,发现这个后端应该是默认的:

    AUTHENTICATION_BACKENDS = (
        'django.contrib.auth.backends.ModelBackend',
    )
    

    所以我将它添加到我的 settings.py 文件中,现在它可以工作了,没有权限的用户无法创建新实例。希望对你有帮助。

    【讨论】:

      【解决方案3】:

      您需要 django-guardian 和 DRF 才能使 DjangoModelPermissions 正常工作。在原始文档http://www.django-rest-framework.org/api-guide/permissions 的 DjangoModelPermissions 段落下也提到了这一点

      如果它仍然无法正常工作,请告诉我们

      【讨论】:

      • 文档表明在 DjangoObjectPermissions 部分下提到了 django-guardian,而不是 DjangoModelPermissions。在@Fabiot 的问题中,他使用的是后者(我也是)。两者都需要监护人吗?
      猜你喜欢
      • 1970-01-01
      • 2013-05-03
      • 2019-07-29
      • 1970-01-01
      • 2016-10-21
      • 2019-07-06
      • 2014-06-07
      • 2021-02-18
      • 2020-01-01
      相关资源
      最近更新 更多