Для чего в Django REST Framework используются классы разрешений (Permission classes)

Ответ

Классы разрешений (Permission classes) в Django REST Framework (DRF) — это основной механизм для определения и принудительного применения политик доступа к эндпоинтам API.

Они определяют, имеет ли аутентифицированный (или анонимный) пользователь право выполнять определенное действие (например, GET, POST, DELETE) над объектом.

Ключевые задачи:

  1. Гранулярный контроль доступа: Позволяют создавать гибкие правила. Например, разрешить чтение всем, а редактирование — только автору записи или администратору.
  2. Переиспользование логики: Правила доступа выносятся в отдельные классы, которые можно применять к разным View.
  3. Безопасность: Защищают данные от несанкционированного доступа и модификации.

Как это работает:

DRF проверяет разрешения, вызывая методы .has_permission() (для доступа к представлению) и .has_object_permission() (для доступа к конкретному объекту).

Пример: Только администратор может редактировать

from rest_framework.permissions import BasePermission, SAFE_METHODS

class IsAdminUserOrReadOnly(BasePermission):
    """
    Разрешает полный доступ администраторам и доступ только для чтения 
    (GET, HEAD, OPTIONS) всем остальным пользователям.
    """
    def has_permission(self, request, view):
        # Разрешить безопасные методы всем
        if request.method in SAFE_METHODS:
            return True

        # Разрешить любые методы, если пользователь — администратор
        return bool(request.user and request.user.is_staff)

# Применение в View
from rest_framework.views import APIView
from rest_framework.response import Response

class MyDataView(APIView):
    permission_classes = [IsAdminUserOrReadOnly]

    def get(self, request):
        return Response({"data": "some public data"})

    def post(self, request):
        # Этот метод будет доступен только администраторам
        return Response({"status": "data created"})

Ответ 18+ 🔞

А, ну вот, слушай, подъехал я тут к теме про классы разрешений в Django REST Framework, а ты сидишь такой и думаешь: «Ну и нахуя мне это, я ж просто хочу API сделать». А потом, блядь, какой-нибудь левый пользователь тебе весь бэкенд в ноль отредактирует, и ты будешь сидеть с круглыми глазами, типа «ой, ёпта, а как так-то?».

Так вот, классы разрешений в DRF — это, по сути, такие здоровенные вышибалы на входе в твой API-бар. Они смотрят на каждого, кто пришёл, и решают: этому можно только посмотреть меню (GET), а этому можно ещё и заказать (POST), а этому, который админ, — вообще за бар зайти и бухло бесплатно наливать.

Зачем это, блядь, нужно:

  1. Чтобы не было пиздеца. Представь, любой аноним может удалить все твои записи. Это пиздец. А с разрешениями — нет, не может.
  2. Чтобы правила были умными. Например, свою запись в блоге ты можешь и удалить, и изменить, а чужую — только прочитать. Всё это описывается тут.
  3. Чтобы не повторяться. Написал один раз класс-вышибалу и кидаешь его на все входы, где нужны одинаковые правила. Красота, а не жизнь.

Как это, сука, работает:

DRF, когда к нему стучится запрос, сначала спрашивает у этих классов: «Мужики, пропускать?». Сначала спрашивает про доступ к виду вообще (has_permission), а если дело дошло до конкретной записи в базе (например, пост с id=5), то спрашивает ещё раз, но уже про этот объект (has_object_permission).

Пример: Чтобы только админ мог всё, а остальные — только смотреть

Смотри, как это выглядит в коде. Всё логично, блядь.

from rest_framework.permissions import BasePermission, SAFE_METHODS

class IsAdminUserOrReadOnly(BasePermission):
    """
    Админам — зелёный свет на всё.
    Всем остальным — только смотреть (GET, HEAD, OPTIONS), руками не трогать.
    """
    def has_permission(self, request, view):
        # Если метод безопасный (только чтение) — пускаем всех, даже анонимов
        if request.method in SAFE_METHODS:
            return True

        # А если метод опасный (POST, PUT, DELETE) — пускаем только админа
        # Проверяем, есть ли пользователь и стоит ли у него галочка is_staff
        return bool(request.user and request.user.is_staff)

# А теперь применяем эту хуйню во вьюхе
from rest_framework.views import APIView
from rest_framework.response import Response

class MyDataView(APIView):
    # Вешаем нашего вышибалу на эту вьюху
    permission_classes = [IsAdminUserOrReadOnly]

    def get(self, request):
        # Сюда пустит всех, потому что GET — безопасный метод
        return Response({"data": "какие-то публичные данные"})

    def post(self, request):
        # А сюда, сука, попробуй зайди без прав админа — получишь по ебалу (403 Forbidden)
        return Response({"status": "данные созданы"})

Вот и вся магия. Написал один класс, и теперь у тебя не какой попало распиздяй может писать в базу, а только избранные. А то без этого — один хуй, рано или поздно, накосячишь.