权限控制可以限制用户对于视图的访问和对于具体数据对象的访问。
第一种:
settings.py中,全局设置,设置默认的权限管理类permission_classes:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
)
}
第二种:
也可以在具体的视图中,通过permission_classes属性来设置(在当前视图设置的,等级是比全局设置要高的)
from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import RetrieveAPIView
class BookDetailView(RetrieveAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
# 认证管理
# 认证管理一般和权限管理配合使用
authentication_classes = [SessionAuthentication] # 此视图,采用session认证
permission_classes = [IsAuthenticated] # 权限是,必须通过了认证机制
第三种:
在项目中,未指明(未设置)permission_classes,则Django采用如下默认配置
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
)
第四种(重点):
自定义权限,需继承rest_framework.permissions.BasePermission父类,并实现以下两个任何一个方法或全部
注意:其实很简单,就是True还是False
方法1:
has_permission(self, request, view)
是否可以访问视图, view表示当前视图对象 => 对视图访问权限的自定义
方法2:
has_object_permission(self, request, view, obj)
是否可以访问数据对象, view表示当前视图, obj为数据对象 => 对该对象访问的权限自定义
例子:
rest_framework.permissions import BasePermission
class MyPermission(BasePermission):
def has_object_permission(self, request, view, obj):
""" 控制对obj对象的访问权限,此案例拒绝所有对数据对象的访问 """
return False
class BookInfoViewSet(ModelViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
# 即,即使认证通过了,但是不能对数据对象进行访问
permission_classes = [IsAuthenticated, MyPermission]