Сами по себе аутентификация или идентификация обычно недостаточны для получения доступа к информации или коду. Для этого объект, запрашивающий доступ, должен иметь авторизацию.
request.user
и request.auth
, чтобы определить, следует ли выполнить входящий запрос.IsAuthenticated
в REST framework.IsAuthenticatedOrReadOnly
в REST framework.exceptions.PermissionDenied
или exceptions.NotAuthenticated
, и основная часть представления не будет запущена.403 Forbidden
или 401 Unauthorized
в соответствии со следующими правилами:HTTP 403 Forbidden
.WWW-Authenticate
. - будет возвращен ответ HTTP 403 Forbidden
.WWW-Authenticate
. - Будет возвращен ответ HTTP 401 Unauthorized
с соответствующим заголовком WWW-Authenticate
..get_object()
. Как и в случае с разрешениями уровня представления, исключение exceptions.PermissionDenied
будет вызвано, если пользователю не разрешено действовать с данным объектом.get_object
в общем представлении, вам необходимо явно вызвать метод .check_object_permissions (request, obj)
для представления в точке, в которой вы извлекли объект.PermissionDenied
, либо NotAuthenticated
, либо просто вернется, если представление имеет соответствующие разрешения.DjangoObjectPermissions
, предоставленные классы разрешений в rest_framework.permissions
не реализуют методы, необходимые для проверки разрешений объекта.has_object_permission()
, описанный в разделе Custom permissions (ниже).DEFAULT_PERMISSION_CLASSES
. Например.APIView
.@api_view
с представлениями на основе функций.rest_framework.permissions.BasePermission
, разрешения могут быть составлены с использованием стандартных побитовых операторов Python. Например, IsAuthenticatedOrReadOnly
можно записать:& (and)
, | (или)
и ~ (не)
.AllowAny
разрешит неограниченный доступ независимо от того, был ли запрос аутентифицирован или не аутентифицирован.IsAuthenticated
откажет в разрешении любому неаутентифицированному пользователю и разрешит разрешение в противном случае.IsAdminUser
будет отказывать в разрешении любому пользователю, если только user.is_staff
не равен True
, и в этом случае разрешение будет разрешено.IsAuthenticatedOrReadOnly
позволит аутентифицированным пользователям выполнять любой запрос. Запросы для неавторизованных пользователей будут разрешены только в том случае, если метод запроса является одним из «безопасных» методов: GET
, HEAD
или OPTIONS
.django.contrib.auth
разрешения модели. Это разрешение должно применяться только к представлениям, у которых установлено свойство .queryset
. Авторизация будет предоставлена только в том случае, если пользователь аутентифицирован и ему назначены соответствующие разрешения модели.POST
требуют, чтобы у пользователя было право add
на модель.PUT
и PATCH
требуют, чтобы у пользователя было право change
модели.DELETE
требуют, чтобы у пользователя было право delete
модели.view
для запросов GET
.DjangoModelPermissions
и установите свойство .perms_map
. За подробностями обращайтесь к исходному коду.queryset
.get_queryset()
, то в представлении может не быть атрибута queryset
. В этом случае мы предлагаем также пометить представление контрольным набором запросов, чтобы этот класс мог определить необходимые разрешения. Например:DjangoModelPermissions
, но также позволяет неаутентифицированным пользователям иметь доступ только для чтения к API.DjangoModelPermissions
, это разрешение должно применяться только к представлениям, имеющим свойство .queryset
или метод .get_queryset()
. Авторизация будет предоставлена только в том случае, если пользователь аутентифицирован и имеет соответствующие разрешения для каждого объекта и соответствующие разрешения модели.POST
требуют, чтобы у пользователя было право add
на объект модели.PUT
и PATCH
требуют, чтобы у пользователя было право change
на объект модели.DELETE
требуют, чтобы у пользователя было право delete
на объект модели.DjangoObjectPermissions
не требует пакета django-guardian
и должен поддерживать другие серверные части объектного уровня одинаково хорошо.DjangoModelPermissions
, вы можете использовать пользовательские разрешения модели, переопределив DjangoObjectPermissions
и установив свойство .perms_map
. За подробностями обращайтесь к исходному коду.view
на уровне объекта для запросов GET
, HEAD
и OPTIONS
и вы используете django-guardian для своей серверной части разрешений на уровне объекта, вам следует рассмотреть возможность использования Класс DjangoObjectPermissionsFilter
, предоставляемый пакетом djangorestframework-guardian
. Это гарантирует, что конечные точки списка возвращают только результаты, включая объекты, для которых у пользователя есть соответствующие разрешения на просмотр.BasePermission
и реализуйте один или оба из следующих методов:.has_permission(self, request, view)
.has_object_permission(self, request, view, obj)
True
, если запросу должен быть предоставлен доступ, и False
в противном случае.SAFE_METHODS
, которая представляет собой кортеж, содержащий 'GET'
, 'OPTIONS'
и 'HEAD'
. Например:has_object_permission
на уровне экземпляра будет вызываться только в том случае, если проверки has_permission
на уровне представления уже прошли. Также обратите внимание, что для запуска проверок на уровне экземпляра код представления должен явно вызывать .check_object_permissions(request, obj)
. Если вы используете общие представления, это будет сделано за вас по умолчанию. (Представления на основе функций должны будут явно проверять права доступа к объектам, вызывая PermissionDenied
в случае ошибки.)PermissionDenied
, если тест не пройден. Чтобы изменить сообщение об ошибке, связанное с исключением, реализуйте атрибут message
непосредственно в вашем настраиваемом разрешении. В противном случае будет использован атрибут default_detail
из PermissionDenied
. Точно так же, чтобы изменить идентификатор кода, связанный с исключением, реализуйте атрибут code
непосредственно в вашем настраиваемом разрешении - в противном случае будет использоваться атрибутdefault_code
из PermissionDenied
.self.check_object_permissions(request, obj)
из представления, когда у вас есть экземпляр объекта. Этот вызов вызовет соответствующее исключение APIException
, если какая-либо проверка разрешений на уровне объекта завершится неудачно, и в противном случае просто вернется.AWS Identity & Access Management
.