Смущает Django Rest Framework Разрешения - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть сложный набор разрешений, которые я хочу применить к своим представлениям, но мне трудно понять, где их разместить. Вот мои основные c разрешения.

Список всех проектов:

  • Если пользователь является владельцем и его учетная запись активна
  • Или если они суперпользователь
  • И объект не является частным для другого пользователя
  • Или они являются членами назначенной группы

Проблема заключается в том, что когда я добавляю этот лог c для классов разрешений ModelApiViewset, он возвращает каждый проект. Как заставить его отображать только те из них, которые соответствуют вышеуказанным критериям?

Чтобы проиллюстрировать этот пример, у меня есть 2 аккаунта: мой суперпользователь и test_user. test_user не является учетной записью администратора или персонала и не входит в группу менеджеров. Учетная запись test_user является владельцем проекта 2, но не проекта 1. Но если я использую учетные данные test_user, я вижу оба проекта 1 и 2:

[
    {
        "id": 1,
        "name": "Test Private Project",
        "slug": "test-private-project",
        "description": "Just testing the super private project",
        "group": {
            "name": "manager",
            "id": 1
        },
        "created_date": "2020-04-20T18:04:20.666564Z",
        "modified_date": "2020-04-20T18:04:20.666594Z",
        "owner": {
            "username": "admin",
            "full_name_display": "Administrator",
            "photo": null,
            "is_active": true,
            "id": 1
        },
        "is_private": true
    },
    {
        "id": 2,
        "name": "Test User Project",
        "slug": "test-user-project",
        "description": "Test project for users",
        "group": {
            "name": "Users",
            "id": 2
        },
        "created_date": "2020-04-20T20:10:02.068390Z",
        "modified_date": "2020-04-20T20:10:02.068429Z",
        "owner": {
            "username": "test_user",
            "full_name_display": "Test User",
            "photo": null,
            "is_active": true,
            "id": 2
        },
        "is_private": false
    }
]

Test_user не должен видеть проект 1, потому что они не владелец, не администратор, и проект является частным для администратора.

просмотр:

class ProjectListViewSet(viewsets.ModelViewSet):
    queryset = Project.objects.all()
    serializer_class = ProjectSerializer
    authentication_classes = [TokenAuthentication, ]
    permission_classes = [IsOwner, IsActive, IsPrivatelyOwned]

права доступа:

class IsOwner(BasePermission):
    def has_object_permission(self, request, view, obj):
        return obj.owner == request.user


class IsActive(BasePermission):
    def has_object_permission(self, request, view, obj):
        return request.user.is_active


class IsPrivatelyOwned(BasePermission):
    def has_object_permission(self, request, view, obj):
        if obj.is_private:
            if obj.owner == request.user:
                return True
            return False
        return True

Я знаю, что я ' Я пропускаю что-то довольно простое здесь, но я не могу понять это. Любая помощь будет принята с благодарностью. Заранее спасибо.

1 Ответ

1 голос
/ 21 апреля 2020

Я думаю, вы не понимаете, что такое разрешения. Разрешения и фильтры - это две разные вещи. Разрешения управляют правом доступа к объектам в вашей базе данных.

Из do c: также обратите внимание, что общие представления c проверят только разрешения уровня объекта для представлений, которые получить один экземпляр модели. Если вам требуется фильтрация представлений списка на уровне объектов, вам нужно будет отфильтровать набор запросов отдельно. Подробнее см. документацию по фильтрации .

...