6

为什么django rest框架在创建对象时不检查对象权限?用户应该能够创建他们看不到、更新或删除的对象是没有意义的(无论如何对我来说)。目前我子类化一个视图集

class CheckCreatePermissionsViewSet(ModelViewSet):
    def perform_create(self, serializer):
    '''
    Called by create before calling serializer.save()
    '''
    obj = serializer.save()
    try:
        self.check_object_permissions(obj)
    except:
        obj.delete()
        raise

为什么默认情况下不实现?这让我很头疼,我想不出一个原因会这样实现。

4

3 回答 3

1

我发现在创建对象之前调用业务逻辑验证比创建对象并确定用户是否可以看到它来删除它更自然和明确。

class CheckCreatePermissionsViewSet(ModelViewSet):
    def perform_create(self, serializer):
        try:
            business_rules_are_ok(serializer.data, user):
        except BusinessException:
            raise ValidationError(<content from BusinessException)
        serializer.save()
于 2015-12-04T09:29:46.627 回答
0

如果您的意图不是在用户没有特定权限的情况下创建对象,您可以在 Viewset 中使用 permission_classes ,这样视图集甚至不允许用户创建对象。

为什么需要根据权限创建然后再次删除?最好先检查权限,这样如果权限失败,甚至不会创建对象。

例如,您只希望管理员创建对象,您可以添加 permission_classes=[permissions.IsAdminUser]到视图集中,这样该控件甚至不会进入 perform_create。如果普通用户尝试创建对象,Viewset 将发送 403。希望这是你想要的。

于 2015-12-04T06:21:55.750 回答
0

在我的方法中,我使用 perform_create 来完成您建议的工作。但是,我没有创建和删除它,而是使用事务来处理它,代码:

class CheckCreatePermissionsViewSet(ModelViewSet):
    def check_object_permissions(self, request, obj):
        super(type(self), self).check_object_permissions(request, obj)
        #Additional logic....
        if not request.user.is_staff:
            raise PermissionDenied()


    def perform_create(self, serializer):
        with transaction.atomic():
            super(type(self), self).perform_create(serializer)
            obj = serializer.instance
            self.check_object_permissions(self.request, obj)
于 2019-09-20T09:56:43.367 回答