本节大纲
1、Permissions
Permissions
权限是用来授权或者拒绝用户访问API的不同部分的不同的类的。基础的权限划分
1、IsAuthenticated 允许任何通过认证的用户访问,拒绝任何没有通过认证的用户。 2、IsAuthenticatedOrReadOnly 认证通过的用户有所有访问权限,反之只有只读权限
权限的定义
rest框架内的权限总是被定义成一个权限类的列表。主视图运行前检查,失败就引发exceptions.PermissionDenied或者exceptions.NotAuthenticated异常
权限检查失败会根据下面的情况返回'403 Forbidden'或'401 Unauthorized':
1、请求验证成功,权限拒绝 # 返回HTTP 403 Forbidden响应 2、请求没有验证成功,最上面的验证类没有使用'WWW-Authenticate'头 # 返回'HTTP 403 Forbidden' 响应 3、请求没有认证成功,最上面的认证类没有使用'WWW-Authenticate'头 # 返回'HTTP 401 Unauthorized'响应,带有一个合适的WWW-Authenticate头
对象级别的权限
在rest框架内,存在于一般视图的.get_object()方法里,如果不允许,引发exceptions.PermissionDenied异常。
如果您正在编写自己的视图,并且希望强制执行对象级别的权限,或者如果您在一般视图上重写.get_object()方法,那么您将需要在检索对象时显式地调用视图上的.check_object_per.(request,obj)方法。失败则引发PermissionDenied或者NotAuthenticated异常
def get_object(self): obj = get_object_or_404(self.get_queryset(), pk=self.kwargs["pk"]) self.check_object_permissions(self.request, obj) return obj
对象级别权限的限制
事实上,因为效率原因通用视图不会自动应用对象级别的权限到每一个实例里。通常,当使用对象级别权限时,还希望适当地过滤queryset,以确保用户只对它们允许查看的实例具有可见性。
设置权限策略
默认可以全局设置,使用DEFAULT_PERMISSION_CLASSES
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ) }
如果没有指定,默认设定是允许不受限制的访问
'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.AllowAny', )
在CBV的View或者ViewSet上
from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView class ExampleView(APIView): permission_classes = (IsAuthenticated,) def get(self, request, format=None): content = { 'status': 'request was permitted' } return Response(content)
在FBV上
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, )) def example_view(request, format=None): content = { 'status': 'request was permitted' } return Response(content)
API Reference
1、AllowAny
允许不受限制的访问,无论请求有没有被认证。
2、IsAuthenticated
拒绝没有通过认证的用户。适用于API只允许注册用户访问
3、IsAdminUser
拒绝任何的用户,除非user.is_staff为True才能访问
4、IsAuthenticatedOrReadOnly
允许通过认证的用户执行任何请求,没有通过认证的用户是只读权限,安全方法:GET
, HEAD
或者 OPTIONS
.
DjangoModelPermissions