Как я могу добавить класс проверки подлинности для достижения?

#authentication #django-rest-framework #permissions

Вопрос:

У меня есть класс представления, который проверяет наличие определенных разрешений в зависимости от типа пользователя, т. Е. Я хочу проверить наличие определенного разрешения только в том случае, если запрос поступает от пользователя, не прошедшего проверку подлинности, или запрос содержит параметр query_param, иначе я хочу, чтобы в действие вступило то, что присутствует в классах разрешений и аутентификации_классы, вот мой класс представления и другая соответствующая информация:-

views.py

 class DeviceLocationView(
    generics.RetrieveUpdateDestroyAPIView
):
    serializer_class = DeviceLocationSerializer
    authentication_classes = [
        BearerAuthentication,
        SessionAuthentication,
    ]
    permission_classes = [IsAuthenticated, DjangoModelPermissions]
    queryset = Device.objects.select_related(
        'devicelocation', 'devicelocation__location'
    )


    def get_permissions(self):
        if not self.request.user.is_authenticated:
            return [DevicePermission(),]
        elif 'key=' in self.request.META.get('QUERY_STRING'):
                return [DevicePermission(),]
        else:
            return [IsAuthenticated(), DjangoModelPermissions(),]
 

Пользовательское разрешение(разрешение устройства):-

 class DevicePermission(BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.query_params.get('key'):
            received_key = request.query_params.get('key')
            try:
                device_key = obj.key
            except AttributeError:
                device_key = obj.device.key
            return received_key == device_key
        else:
            return False
 

Вышеприведенная реализация работает, но когда я отправляю некоторую информацию заголовка для аутентификации через postman или thunderclient, она возвращает 403.

Я хочу создать пользовательский класс аутентификации, который просто проверяет наличие request.query_params.get('key') , затем в этом классе я хочу изменить его так, чтобы я принудительно применял ключ, чтобы он был правильным, только если запрос поступает от пользователя, не прошедшего проверку подлинности.

Возможно ли/выполнимо ли это?

Комментарии:

1. Вероятно, вы можете создать пользовательский класс аутентификации и поместить его в качестве последнего класса, authentication_classes чтобы убедиться, что другие классы аутентификации были запущены и не нашли пользователя.