身份验证或身份识别本身通常不足以获取信息或代码的访问权限。因此,请求访问的实体必须具有授权
如何确定权限
REST框架中的权限始终被定义为一个权限类的列表。
在运行视图的主体之前,检查列表中的每个权限。 如果任何权限检查失败,会抛出一个exceptions.PermissionDenied
或 exceptions.NotAuthenticated
异常,并且视图的主体将不会运行
当权限检查失败时,将返回"403 Forbidden"或"401 Unauthorized"响应,具体根据以下规则:
- 请求已成功通过身份验证,但权限被拒绝。 — 将返回403 Forbidden响应。
- 请求未成功认证,最高优先级的认证类不使用
WWW-Authenticate
标头。— 将返回403 Forbidden响应。 - 请求未成功认证,最高优先级的认证类使用
WWW-Authenticate
标头。— 将返回HTTP 401未经授权的响应,并附带适当的WWW-Authenticate
标头。
设置权限策略
全局配置(默认),在setting.py文件中配置
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
)
}
如果未指定,则此设置默认为允许无限制访问
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
)
使用基于APIView
类的视图在每个视图或每个视图集的基础上设置身份验证策略。
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
class ExampleView(APIView):
permission_classes = (IsAuthenticated,)
使用@api_view
装饰器装饰基于函数的视图
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
@api_view(['GET'])
@permission_classes((IsAuthenticated, ))
API参考
-
AllowAny
权限类将允许不受限制的访问,而不管该请求是否已通过身份验证或未经身份验证。 -
IsAuthenticated
权限类将拒绝任何未经身份验证的用户的权限,并允许其他权限,注册用户访问 - 除非
user.is_staff
为True
,否则IsAdminUser
权限类将拒绝任何用户的权限,只能被部分受信任的管理员访问 -
IsAuthenticatedOrReadOnly
将允许经过身份验证的用户执行任何请求,允许匿名用户读取权限,允许对已通过身份验证的用户进行写入权限 - DjangoModelPermissions只能应用于具有
.queryset
属性集的视图,只有在用户通过身份验证并分配了相关模型权限的情况下,才会被授予权限 - DjangoModelPermissionsOrAnonReadOnly 允许未经身份验证的用户具有对API的只读访问权限
- DjangoObjectPermissions权限只能应用于具有
.queryset
属性或.get_queryset()
方法的视图。只有在用户通过身份验证并且具有相关的每个对象权限和相关的模型权限后,才会被授予权限。Django的标准对象权限框架相关联,该框架允许模型上的每个对象的权限,为了使用此权限类,你还需要添加支持对象级权限的权限后端,例如django-guardian。