JavaRush /Курси /Модуль 3: Django /Обмеження доступу на основі дозволів

Обмеження доступу на основі дозволів

Модуль 3: Django
Рівень 21 , Лекція 1
Відкрита

Давай уявимо просту аналогію. Ти — охоронець величезного замку. У тебе є кілька дверей, які ведуть у різні кімнати, і ти не хочеш, щоб усі підряд заходили у всі кімнати без перевірки. Ось тут і вступають у гру "дозволи". Вони як ключі — визначають, хто може зайти і що він може робити всередині.

У світі Django REST Framework, дозволи дають тобі можливість чітко вказати, хто може отримати доступ до різних ресурсів твого API. Це забезпечує:

  1. Безпеку: обмежений доступ запобігає витоку даних.
  2. Контроль доступу: ти можеш зробити ресурси доступними лише для певних користувачів чи груп.
  3. Гнучкість: можливість налаштування дозволяє адаптуватися до специфічних вимог застосунку.

Основи дозволів у 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 надає готові класи дозволів, які покривають більшість стандартних випадків:

  1. AllowAny

    Дозволяє доступ усім користувачам (підходить для публічних ресурсів, таких як реєстрація).

    from rest_framework.permissions import AllowAny
    
    class PublicViewSet(viewsets.ModelViewSet):
        permission_classes = [AllowAny]
  2. IsAuthenticated

    Гарантує доступ лише автентифікованим користувачам. Корисно для закритих API.

    from rest_framework.permissions import IsAuthenticated
    
    class PrivateViewSet(viewsets.ModelViewSet):
        permission_classes = [IsAuthenticated]
  3. IsAdminUser

    Доступ тільки адміністраторам. Може бути корисним для ендпоінтів, пов'язаних з управлінням системою.

    from rest_framework.permissions import IsAdminUser
    
    class AdminOnlyViewSet(viewsets.ModelViewSet):
        permission_classes = [IsAdminUser]
  4. DjangoModelPermissions

    Перевіряє дозволи моделі через систему дозволів Django.

    from rest_framework.permissions import DjangoModelPermissions
    
    class ModelProtectedViewSet(viewsets.ModelViewSet):
        permission_classes = [DjangoModelPermissions]
  5. 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, ви захищаєте бізнес і користувачів. Це цінно і на співбесідах! Уміння пояснити, як працюють дозволи, показує вашу зрілість як розробника, а в реальних проєктах це допоможе вам уникнути багатьох проблем.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ