drf -- 权限组件Permissions

权限组件Permissions,与认证组件用法类似

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

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

提供的权限

  • AllowAny 允许所有用户
  • IsAuthenticated 仅通过登录认证的用户
  • IsAdminUser 仅管理员用户
  • IsAuthenticatedOrReadOnly 已经登陆认证的用户可以对数据进行增删改操作,没有登陆认证的只能查看数据。

配置权限的方式一:

在配置文件中进行全局配置

# drf的配置信息,必须写在REST_FRAMEWORK的字典中,才能被drf识别
REST_FRAMEWORK = {
    ....
    #  权限[全局配置,所有的视图都会被影响到]
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated', # 已经登录认证的用户才能访问
                 .......
         #可以添加多个权限类,也可以自定义权限类
    )
}

#如果未指明,则采用如下默认配置
'DEFAULT_PERMISSION_CLASSES': (
   'rest_framework.permissions.AllowAny',
)

配置权限的方式一:

在具体的视图中通过permission_classes属性来设置

  • 示例代码:
from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import RetrieveAPIView

class StudentAPIView(RetrieveAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsAuthenticated]

自定义权限

  • 如需自定义权限,需继承rest_framework.permissions.BasePermission父类,并实现以下两个任何一个方法或全部
    • .has_permission(self, request, view)
      • 是否可以访问视图, view表示当前视图对象
    • .has_object_permission(self, request, view, obj)
      • 是否可以访问数据模型对象, view表示当前视图, obj为模型数据对象

示例代码:

from rest_framework.permissions import BasePermission

class IsXiaoMingPermission(BasePermission):
    #该信息会在认证失败时,当做响应信息返回
    message = {"code":00,"data":"认证失败"}
    
    def has_permission(self, request, view):
        #权限认证的逻辑,自定义
        if request.user and request.user.username == "xiaoming":
            return True #返回Trun表示有该权限,返回False表示无该权限
  
    def has_object_permission(self, request, view, obj):
        '''
        将权限控制粒度到某一条数据,可以通过request.user获取到当前用户,
        obj就是当前的获取到的对象,判断一下当前用户,对对象数据是否有权限访问
        所以当有这样的需求时,可以将逻辑写在这个方法里
        :param request: 
        :param view: 
        :param obj: 
        :return: 
        '''
        return True

class StudentViewSet(ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    permission_classes = [IsXiaoMingPermission]  #让该属性直接选择自定义的 权限类,视图函数中就方法就是执行自定义的权限
posted @   志强爱璇璇  阅读(292)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示