Джанго остальные модели разрешений - PullRequest
0 голосов
/ 04 апреля 2019

Я использую Django 2.1 и djangorestframework 3.9.2. Я хотел бы иметь возможность контролировать доступ к операциям REST на объектах модели Django через интерфейс администратора Django, в идеале используя разрешения пользователя. Например, только пользователи, которые имеют разрешения на чтение для объекта модели Foo, могут видеть Foo в моем REST API.

Я прочитал документы и, возможно, я мог бы использовать DjangoModelPermissions или DjangoObjectPermissions .

Однако, когда я очищаю все пользовательские разрешения в БД и устанавливаю для DEFAULT_PERMISSIONS_CLASS либо DjangoModelPermissions, либо DjangoObjectPermissions, я все еще могу видеть вещи в REST API. Это означает, что отсутствие разрешений не мешает мне видеть объекты, как я и надеялся.

Пример настроек:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.DjangoModelPermissions',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
}

Пример представления объекта:

from rest_framework import routers, serializers, viewsets
from .models import Example

class ExampleSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Example
        fields = '__all__'

class ExampleViewSet(viewsets.ModelViewSet):
    queryset = Example.objects.all()
    serializer_class = ExampleSerializer

router = routers.DefaultRouter()
router.register(r'examples', ExampleViewSet)

Предложения

1 Ответ

2 голосов
/ 04 апреля 2019

DjangoModelPermissions применяет только правила разрешений для модификации данных (для POST , PUT , PATCH и DELETE запросов), но не применять правила разрешений для просмотра данных.

Чтобы ограничить просмотр данных, вы можете добавить пользовательское разрешение на просмотр и подкласс DjangoModelPermissions , чтобы использовать это разрешение, как описано в документах

РЕДАКТИРОВАТЬ:

В Django 2.1 добавлено разрешение view для модели. Так что это, вероятно, будет поддерживаться DjangoModelPermissions в будущих выпусках, но до тех пор вы можете попытаться создать подкласс DjangoModelPermissions, например, чтобы добавить проверку прав доступа:

class DjangoModelPermissionsWithRead(DjangoModelPermissions):
    perms_map = {
        'GET': ['%(app_label)s.view_%(model_name)s'],
        'OPTIONS': [],
        'HEAD': [],
        'POST': ['%(app_label)s.add_%(model_name)s'],
        'PUT': ['%(app_label)s.change_%(model_name)s'],
        'PATCH': ['%(app_label)s.change_%(model_name)s'],
        'DELETE': ['%(app_label)s.delete_%(model_name)s'],
    }
...