Давай уявимо просту аналогію. Ти — охоронець величезного замку. У тебе є кілька дверей, які ведуть у різні кімнати, і ти не хочеш, щоб усі підряд заходили у всі кімнати без перевірки. Ось тут і вступають у гру "дозволи". Вони як ключі — визначають, хто може зайти і що він може робити всередині.
У світі Django REST Framework, дозволи дають тобі можливість чітко вказати, хто може отримати доступ до різних ресурсів твого API. Це забезпечує:
- Безпеку: обмежений доступ запобігає витоку даних.
- Контроль доступу: ти можеш зробити ресурси доступними лише для певних користувачів чи груп.
- Гнучкість: можливість налаштування дозволяє адаптуватися до специфічних вимог застосунку.
Основи дозволів у Django REST Framework
У Django REST Framework дозволи перевіряються перед виконанням логіки представлення. Якщо користувачеві не дозволено доступ, DRF автоматично повертає HTTP-відповідь із кодом помилки 403 Forbidden. Таким чином, ваша логіка представлення залишається у безпеці — вона навіть не буде виконана, якщо дозвіл відхилено.
Дозволи в DRF перевіряються за допомогою наступних методів:
has_permission(self, request, view): перевіряє доступ на рівні всього представлення (наприклад, чи дозволений доступ до ендпоінту/api/products/).has_object_permission(self, request, view, obj): перевіряє доступ на рівні конкретного об'єкта (наприклад, чи дозволений доступ до продукту з id=1).
Цей дворівневий підхід дозволяє точніше контролювати доступ.
Вбудовані класи дозволів
Django REST Framework надає готові класи дозволів, які покривають більшість стандартних випадків:
AllowAny
Дозволяє доступ усім користувачам (підходить для публічних ресурсів, таких як реєстрація).
from rest_framework.permissions import AllowAny class PublicViewSet(viewsets.ModelViewSet): permission_classes = [AllowAny]IsAuthenticated
Гарантує доступ лише автентифікованим користувачам. Корисно для закритих API.
from rest_framework.permissions import IsAuthenticated class PrivateViewSet(viewsets.ModelViewSet): permission_classes = [IsAuthenticated]IsAdminUser
Доступ тільки адміністраторам. Може бути корисним для ендпоінтів, пов'язаних з управлінням системою.
from rest_framework.permissions import IsAdminUser class AdminOnlyViewSet(viewsets.ModelViewSet): permission_classes = [IsAdminUser]DjangoModelPermissions
Перевіряє дозволи моделі через систему дозволів Django.
from rest_framework.permissions import DjangoModelPermissions class ModelProtectedViewSet(viewsets.ModelViewSet): permission_classes = [DjangoModelPermissions]DjangoObjectPermissions
РозширюєDjangoModelPermissions, додаючи перевірку на рівні об'єктів.
Робота з IsAuthenticated та IsAdminUser
Давайте розглянемо два популярних варіанти застосування вбудованих дозволів: IsAuthenticated та IsAdminUser.
Дозвіл IsAuthenticated дозволяє доступ тільки тим користувачам, які пройшли автентифікацію. Це означає, що користувач має бути зареєстрованим і виконати вхід у систему.
Приклад використання:
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework.response import Response
class AuthRequiredView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
return Response({"message": "Привіт, автентифікований користувач!"})
Спробуйте виконати запит до цього ендпоінту без токена або cookie сесії — ви отримаєте відповідь 403 Forbidden.
Дозвіл IsAdminUser дає доступ тільки користувачам, у яких встановлено прапорець is_staff=True (адміністратори). Він особливо корисний для адміністративних задач.
Приклад використання:
from rest_framework.permissions import IsAdminUser
from rest_framework.views import APIView
from rest_framework.response import Response
class AdminView(APIView):
permission_classes = [IsAdminUser]
def get(self, request):
return Response({"message": "Привіт, адміністратор!"})
Якщо користувач не є адміністратором, він також отримає відповідь 403 Forbidden.
Переваги використання вбудованих дозволів
- Простота: легко застосовувати навіть для початківців розробників.
- Підвищена безпека: чітка логіка захисту доступу.
- Економія часу: немає необхідності писати логіку з нуля.
Проте вбудовані дозволи не завжди підходять для складних сценаріїв. Іноді тобі знадобиться створювати кастомні дозволи, що ми будемо вивчати на наступній лекції.
Типові помилки при роботі з дозволами
- Спроба використовувати дозволи без аутентифікації: якщо користувач не аутентифікований, більшість дозволів (наприклад,
IsAuthenticated) завжди будуть повертатиFalse; пам’ятайте про налаштування аутентифікації в DRF. - Неправильний порядок
permission_classes: якщо у вас кілька класів дозволів, пам’ятайте, що вони перевіряються по порядку. Усі повинні повернутиTrue, щоб користувач отримав доступ. - Використання
IsAdminUserбез встановлення прапораis_staffдля адміністратора: переконайтеся, що ваші адміністратори правильно налаштовані.
Як це допомагає у реальних проєктах?
Без керування доступом ваш API перетвориться на портал хаосу. Наприклад, уявіть, що будь-який користувач може видалити дані інших користувачів. Такі вразливості не тільки викличуть невдоволення клієнтів, але й можуть призвести до юридичних наслідків. Використовуючи дозволи DRF, ви захищаєте бізнес і користувачів. Це цінно і на співбесідах! Уміння пояснити, як працюють дозволи, показує вашу зрілість як розробника, а в реальних проєктах це допоможе вам уникнути багатьох проблем.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ