zoukankan      html  css  js  c++  java
  • 【1125 | Day65】drf认证、权限组件

    一、基本知识

    1. 该三个组件阅读源码的方式和版本源码阅读步骤类似

    详细阅读版本源码https://www.cnblogs.com/yingjp/p/10606698.html

    2. 进入initial可以看到以下方法

    #认证执行的方法:校验用户(游客,合法用户,非法用户)
    self.perform_authentication(request)
    #权限执行的方法:校验用户权限,必须登录,所有用户登录读写,游客只读,自定义用户角色
    self.check_permissions(request)
    #频率执行的方法:限制视图接口被访问的频率次数
    self.check_throttles(request)
    

    3. 进一步对上述的方法进行阅读我们能得出以下几点

    a:在settings中应该怎样配置

    b:自定义组件需要实现什么方法

    c:方法的返回值

    d:对应的属性取值的方法 

    4. 对认证,权限,频率这三个逐渐学习步骤

    ​ a:用rest_framework给我们提供的模块进行定制

    ​ b:自己定义组件

    5. 认证、权限、频率的工作原理

    ​ a:基于哪个类、重写哪个方法、方法的实现体要完成什么事

    二、认证组件

    1. 阅读源码结论

    ​ a:认证类需要继承BaseAuthentication类

    ​ b:需要实现authenticate(self, request)方法

    ​ c:返回一个长度为2的元祖

    ​ d:settings可以通过DEFAULT_AUTHENTICATION_CLASSES配置全局验证

    2. 自定义认证类(配置全局认证)

    ​ a:先写一个认证类

    from  rest_framework.authentication import BaseAuthentication
    from testDemo.models import UserInfo
    from rest_framework.exceptions import AuthenticationFailed
     
    '''
    这里是写的token是存在url中
      1:需要继承BaseAuthentication
      2:需要重写authenticate()方法
      3:返回一个元祖
    '''
     
    class  MyAuth(BaseAuthentication):
        #自定义token在url中
        def authenticate(self, request):
            token = request.query_params.get('token','')
            user=UserInfo.objects.filter(token=token).first()
            if not user:
                raise AuthenticationFailed('token 信息不合理')
     
            return (user,token)
    

    b:settings注册

    ​ --所有的视图函数都会进行认证,其实还不是很必要(局部认证下面介绍)

    REST_FRAMEWORK={
        #认证注册
        'DEFAULT_AUTHENTICATION_CLASSES':['utils.auth.MyAuth',],
    }
    

    3. 使用rest_framework提供的认证组件进行认证。

    认证组件一般都是自己写的,这里介绍自定义组件只是了解,学习视图函数的局部认证。

    a:通过BaseAuthentication这个认证的基类,点进去就能看见所有认证类,使用方式和自定义的认证类一样

    img

    b:局部视图的认证,在需要认证的视图处添加authentication_classes=[authclass1,authclass2]

    from utils.auth import MyAuth
    # Create your views here.
    from rest_framework.views import APIView,Response
    import uuid
    from testDemo.models import UserInfo
    # Create your models here.
    class authDemo(APIView):
        authentication_classes = [MyAuth, ]
        def get(self, request):
            print(request.user)
            print(request.auth)
            return Response('测试代码')  
    

    三、权限组件

    1. 阅读代码结论

    ​ a:settings全局配置key'DEFAULT_PERMISSION_CLASSES'

    ​ b:视图函数局部配置参数permission_classes

    ​ c:权限类需要继承的类from rest_framework.permissions import BasePermission

    ​ d:需要重写的方法has_permission(self, request, view)

    2. 自定义权限类

    from rest_framework.permissions import BasePermission
     
    class MyPermissions(BasePermission):
        def has_permission(self, request, view):
            #登陆成功后登陆信息,存在request.user中
            user_obj =request.user
            #type ==3 普通用户没有该权限
            if user_obj.type ==3:
                return False
            return True
    

    3. 权限配置

    参考第一条。

  • 相关阅读:
    Java 位运算
    Java 自增运算
    Java 变量命名规范
    Java 数据类型
    Java 环境配置
    SQL Server-语句类别、数据库范式、系统数据库组成(一)
    Socket连接时,端口是怎么分配的
    【转载】SQL执行计划
    前端页面播放 rtmp 流与 flv 格式视频文件
    C# Winform Soket 网络编程 多个客户端连接服务器并返回客户端操作请求
  • 原文地址:https://www.cnblogs.com/fxyadela/p/11930181.html
Copyright © 2011-2022 走看看