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": "Привет, аутентифицированный пользователь!"})

Попробуйте выполнить запрос к этому эндпоинту без токена или куки сессии — вы получите ответ 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, вы защищаете бизнес и пользователей. Это ценно и на собеседованиях! Умение объяснить, как работают разрешения, показывает вашу зрелость как разработчика, а в реальных проектах это поможет вам избежать многих проблем.

1
Задача
Модуль 3: Django, 21 уровень, 1 лекция
Недоступна
Кастомное разрешение для владельцев данных
Кастомное разрешение для владельцев данных
1
Задача
Модуль 3: Django, 21 уровень, 1 лекция
Недоступна
Чтение для всех, запись только для авторизованных пользователей
Чтение для всех, запись только для авторизованных пользователей
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ