权限 - Permissions - 自定义

分类

权限控制可以限制用户对于视图的访问和对于具体数据对象的访问。

  • 在执行视图的dispatch()方法前,会先进行视图访问权限的判断
  • 在通过get_object()获取具体对象时,会进行对象访问权限的判断

提供的权限分类(不够用,就自定义)

  • AllowAny 允许所有用户
  • IsAuthenticated 仅通过认证的用户
  • IsAdminUser 仅管理员用户
  • IsAuthenticatedOrReadOnly 认证的用户可以完全操作,否则只能get读取(即没认证通过,但可以get)

设置(4种)

第一种:

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]

 

你可能感兴趣的:(Django开发-Python)