Понимание прав доступа в Django
Я пытаюсь разобраться с правами доступа в Django. В пунктах ниже я написал, что мне удалось найти по этому вопросу и как я это понимаю. Возможно, кто-то сможет подсказать мне, правильно ли я рассуждаю или это работает по-другому. Буду благодарен за дополнительные статьи на эту тему. Спасибо!
1. APIView со встроенными разрешениями
Django имеет некоторые встроенные разрешения, которые мы можем использовать в APIView через permission_classes.
class OrderView(APIView):
permission_classes = [permissions.IsAuthenticated]
Мы можем добавить следующие встроенные разрешения к классам permission_classes, потому что у них нет has_object_permission:
AllowAny, IsAuthenticated, IsAuthenticatedOrReadOnly, IsAdminUser, DjangoModelPermissions, DjangoModelPermissionsOrAnonReadOnly
2. APIView с пользовательскими разрешениями
Допустим, мы хотим использовать пользовательское разрешение из пункта 1 в APIView. Можем ли мы в этом случае использовать permission_classes?
class OrderView(APIView):
permission_classes = [permissions.IsAuthenticatedAndOwner]
Я не знаю, какой объект будет отправлен has_object_permission и как это сделать. Хороший ли это способ?
def has_object_permission(self, request, view, obj): # <-- obj
return obj.user == request.user
3. APIView с разрешениями check_permissions и check_object_permissions.
Я немного запутался в этих методах. Если я правильно понял, эти методы используются для вызова has_permission и has_object_permission из APIView? Есть ли другая причина для их использования? Используем ли мы их только с APIView?
4. ViewSet с пользовательскими разрешениями
Допустим, мы хотим использовать пользовательское разрешение из пункта 1, но с ViewSet
class MessageViewSet(viewsets.ModelViewSet):
permission_classes = [IsAuthenticatedAndOwner]
queryset = Message.objects.all()
serializer_class = MessageSerializer
def perform_create(self, serializer):
serializer.save(author=self.request.user)
В этом случае что будет отправлено в качестве obj в has_object_permission?
def has_object_permission(self, request, view, obj): # <-- obj
return obj.user == request.user
Будут ли это данные из queryset?