#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
чтобы убедиться, что другие классы аутентификации были запущены и не нашли пользователя.