Запретить создание / обновление внешнего ключа, который ссылается на запрещенные объекты в структуре отдыха Django - PullRequest
0 голосов
/ 05 июня 2018

Допустим, у меня есть следующие модели

class Blog(models.Model):
    user = models.ForeignKey(User, null=False, on_delete=models.CASCADE)

class Post(models.Model):
    blog = models.ForeignKey(Blog, null=False, on_delete=models.CASCADE)
    post = models.TextField()

Проблема в том, что создание сообщения позволит мне установить идентификатор блога на что угодно (что существует).Это означает, что я могу создать объект Post, который имеет отношение к Blog объекту, которому пользователь не «владеет».

Однако существуют простые и документированные способы предотвращения доступа пользователяобъекты с помощью метода GET, которые им запрещены, путем фильтрации набора запросов и использования check_object_permissions.Пример:

class PostViewSet(viewsets.ModelViewSet):
    serializer = PostSerializer

def get_queryset(self):
    return Post.objects.filter(blog__user=self.request.user)

def check_object_permissions(self, request, obj):
    if obj.user != request.user:
        raise exceptions.PermissionDenied()
    super().check_object_permissions(request, obj)

Как решить вышеупомянутую проблему и предотвратить создание отношений с запрещенными объектами самым умным / правильным способом в среде REST Django?

1 Ответ

0 голосов
/ 05 июня 2018

Вы можете добавить проверку блога в сериализатор (отметьте Проверка на уровне поля doc) и вызвать ошибку, если у пользователя нет прав доступа к выбранному блогу:

class PostSerializer(serializers.ModelSerializer):
    ...

    def validate_blog(self, value):
        request = self.context['request']
        if value.user != request.user:
            raise serializers.ValidationError('Blog id doesn't exist')
        return value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...