Django Права администратора, примененные к представлениям API REST - PullRequest
0 голосов
/ 15 января 2020

В интерфейсе администратора django можно указать разрешения для каждой отдельной Модели. Варианты разрешений для примера модели Customer:

  • Может добавить клиента
  • Может изменить клиента
  • Может удалить клиента
  • Может просмотреть клиента

Однако эти разрешения, похоже, не применяются к представлениям API REST Framework (rest_framework.viewsets.ModelViewSet), реализованным для Customer следующим образом:

class CustomerViewSet(viewsets.ModelViewSet):
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer

class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = '__all__'

Я думал, что установив От DEFAULT_PERMISSION_CLASSES до DjangoModelPermissions эти разрешения будут отражены, но это не так:

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

Должны ли права, определенные в admin, работать в представлениях также с этими настройками, если они не будут, и / или есть ли какой-либо способ чтобы это произошло? Преимущество заключается в том, что системные администраторы могут легко определять группы в интерфейсе администратора и адаптировать свои разрешения к своим проблемным областям, поэтому очень важно иметь возможность определять разрешения таким образом. Я видел много других способов реализации разрешений, но они, как я уже видел, требуют большой настройки определений View в python.

Версии:

  • Django 2.2.9
  • djangorestframework 3.11.0
  • djangorestframework-simplejwt 4.4.0

1 Ответ

2 голосов
/ 16 января 2020

Чтобы API-представления проверяли группы и разрешения, мы можем использовать DjangoModelPermission в нашем views.py следующим образом.

from rest_framework.permissions import DjangoModelPermissions

class CustomerViewSet(viewsets.ModelViewSet):
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer
    permission_classes = (DjangoModelPermissions, )

Он ограничивает доступ POST, PUT и DELETE, но разрешает доступ GET. Чтобы ограничить это также

from rest_framework.permissions import DjangoModelPermissions

class CustomDjangoModelPermissions(DjangoModelPermissions):
    def __init__(self):
        self.perms_map['GET'] = ['%(app_label)s.view_%       (model_name)s']


class CustomerViewSet(viewsets.ModelViewSet):
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer
    permission_classes = (CustomDjangoModelPermissions, )
...