Безопасность является важной частью любого веб-сайта, но в случае с веб-интерфейсами она важна вдвойне.
В настоящее время API нашего блога предоставляет полный доступ любому пользователю. Нет никаких ограничений; любой пользователь может делать всё, что угодно, что крайне опасно. Например, анонимный пользователь может создавать, читать, обновлять или удалять любую запись в блоге. Даже ту, которую он не создавал! Очевидно, что мы этого не хотим.
Django REST Framework поставляется с несколькими готовыми настройками разрешений, которые мы можем использовать для защиты нашего API. Они могут быть применены на уровне проекта, на уровне представления или на уровне отдельной модели.
В этом разделе мы рассмотрим все три варианта и в итоге создадим пользовательское разрешение, чтобы только автор записи в блоге имел возможность обновлять или удалять ее.
Разрешения на уровне проекта
Django REST Framework имеет множество конфигураций, которые разнесены по именам внутри одного параметра Django под названием REST_FRAMEWORK. Мы уже сделали одну из них, AllowAny, явной в файле mysite/settings.py:
REST_FRAMEWORK = {
"DEFAULT_PERMISSION_CLASSES": [
"rest_framework.permissions.AllowAny",
],
......
}
API Reference
AllowAny
Класс разрешения AllowAny разрешает неограниченный доступ, независимо от того, был ли запрос аутентифицирован или неаутентифицирован. Это разрешение не является строго обязательным, поскольку вы можете достичь того же результата, используя пустой список или кортеж для установки разрешений, но вы можете посчитать полезным указать этот класс, поскольку он делает намерение явным.
IsAuthenticated
Класс разрешения IsAuthenticated будет запрещать разрешение любому пользователю, не прошедшему аутентификацию, и разрешать в противном случае. Это разрешение подходит, если вы хотите, чтобы ваш API был доступен только зарегистрированным пользователям.
IsAdminUser
Класс разрешения IsAdminUser запрещает разрешение любому пользователю, если только user.is_staff не является True, в этом случае разрешение будет разрешено. Это разрешение подходит, если вы хотите, чтобы ваш API был доступен только подгруппе доверенных администраторов.
IsAuthenticatedOrReadOnly
Параметр IsAuthenticatedOrReadOnly позволит аутентифицированным пользователям выполнять любые запросы. Запросы для неаутентифицированных пользователей будут разрешены, только если метод запроса является одним из "безопасных" методов: GET, HEAD или OPTIONS. Это разрешение подходит, если вы хотите, чтобы ваш API разрешал разрешения на чтение анонимным пользователям и разрешал разрешения на запись только аутентифицированным пользователям.
Давайте переключимся на IsAuthenticated, чтобы только аутентифицированные, или вошедшие в систему, пользователи могли просматривать API. Обновите файл mysite/settings.py следующим образом:
REST_FRAMEWORK = {
"DEFAULT_PERMISSION_CLASSES": [
"rest_framework.permissions.IsAuthenticated",
],
.....
...
}
Давайте перейдем по адресу блога - http://127.0.0.1:8000 и выйдем из аккаунта. А после чего зайдем по адресу нашего API http://127.0.0.1:8000/api/ и увидим следующее окошко, которое просит нас авторизоваться:
И в случае если мы не будем авторизовываться, мы не сможем получить доступ к нашему сервису REST API.
Иногда бывают конфликты, а именно невозможно выйти из аккаунта в нашем API. В данном случае можно отключить нашу базовую авторизацию в настройках REST_FRAMEWORK:
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
# 'rest_framework.authentication.BasicAuthentication',
),