Разрешения на уровне представлений
Разрешения могут быть добавлены и на уровне представлений для более детального контроля.
Давайте обновим наш PostDetail так, чтобы его могли просматривать только пользователи-администраторы. Если мы сделаем все правильно, то пользователь, вышедший из системы вообще не сможет просмотреть API, пользователь, вошедший в систему, сможет просмотреть страницу списка, но только администратор сможет просмотреть подробную страницу.
Для удобства давайте добавим возможность авторизации прямо из нашего API сервиса, для этого введем в mysite/urls.py новый маршрутизатор:
path("api-auth/", include("rest_framework.urls")),
Тем самым мы используем встроенную систему авторизации в DRF. Проверим работу:
В файле blog_api/views.py импортируйте permissions из Django REST Framework, а затем добавьте атрибут permission_classes в PostDetail, которое устанавливает значение IsAdminUser.
from rest_framework import generics, permissions # new
class PostDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
permission_classes = (permissions.IsAdminUser,) # new
Это все, что нам нужно. Авторизуемся под любым пользователем, не администратором. Обновите просматриваемый API на http://127.0.0.1:8000/api/, Страница списка по-прежнему доступна для просмотра.
Однако если вы перейдете на http://127.0.0.1:8000/api/1/, чтобы увидеть страницу Post Detail, отображается код состояния HTTP 403 Forbidden:
Если вы войдете в API под своей учетной записью администратора, страница Post Detail будет по-прежнему видна. Таким образом, мы эффективно применили разрешение на уровне просмотра.
Прежде чем мы продолжим, удалите поле permission_classes в PostDetail. Для наших целей достаточно ограничить доступ для не аутентифицированных пользователей, что мы и сделали в mysite/settings.py с помощью конфигурации DEFAULT_PERMISSION_CLASSES.