• DRF的三大认证组件


    DRF的三大认证组件

    认证组件

    工作原理

    首先,认证组件是基于BaseAuthentication类,并重写authenticate方法.

    其认证的规则大概分三个方面:

    1. 如果没有携带认证信息(token),直接返回None,也就是判定登录为游客登录
    2. 如果携带有认证信息,但是校验失败,则会抛出异常,这种情况通常为非法用户,爬虫就属于这一类
    3. 如果有认证信息,且通过校验能够查到数据库中相应的数据,那么就判定登录方为合法用户.

    实现

    在使用认证组件的时候,我们需要新建一个utils文件夹,然后在其下建立对应的认证组件,权限组件和频率组件,

    # /utils/authentications.py
    from rest_framework.authentication import BaseAuthentication
    
    class TokenAuthentication(BaseAuthentication):
        prefix = 'Token'
        def authenticate(self, request):
            # 这里我们需要通过request来拿到前台传来的的token,字典的key为HTTP_AUTHORIZATION,以get取值
            auth = request.META.get('HTTP_AUTHORIZATION')
            # 判断拿到的token是否为空,如果为空则返回None
            if not auth:
                return None
            # 如果不为空,切割
            auth_list = auth.split()
    		# 切割完之后判断如果其长度不是2或者第一位的小写不等于之前我们赋予的token字符串,就是非法用户
            if not (len(auth_list) == 2 and auth_list[0].lower() == self.prefix.lower()):
                raise AuthenticationFailed('非法用户')
    		# 判断以上两步之后,就是合法用户,我们校验其算法之后,让其登录,或者抛异常
            token = auth_list[1]
    
            # 校验算法
            user = _get_obj(token)
            # 校验失败抛异常,成功返回(user, token)
            return (user, token)
    

    权限组件

    工作原理

    权限组件是基于BasePermission类,且重写has_permission方法,该方法字面意思我们也能看懂,就是是否有此权限的意思.

    对于权限的判断也只有常见的两种,返回值为True就是要有权限,返回值为False代表无权限.

    实现

    权限组件的实现与认证权限相似

    # /utils/permissions.py
    from rest_framework.permissions import BasePermission
    class SuperUserPermission(BasePermission):
        # 下面我们重写has_permission方法
        def has_permission(self, request, view):
            # 这里我们判定的是超级用户,即当登录的用户存在且是超级用户的时候权限存在,如果只是判断普通用户的话把and后面的判断条件取消去掉即可
            return request.user and request.user.is_superuser
    

    频率组件

    工作原理

    频率组件起到的作用是限制同一个用户或者IP在一定时间内访问同一接口的次数,其工作原理如下:

    1. 频率组件是基于SimpleRateThrottle,重写的是get_cache_key方法,并设置scope类的属性
    2. scope是一个认证字符串,在配置文件中我们通过配置scope字符串来实现对应的频率设置,scope本身只是一个普通的字符串,只是起到一种提示的作用
    3. get_cache_key方法的返回值是一个字符串,该字符串就是缓存访问次数的缓存key

    实现

    # /utils/throttles.py
    from rest_framework.throttling import SimpleRateThrottle
    
    class ThreeTimeUserThrottle(SimpleRateThrottle):
        # scope本身没有意义,我们将其定义只是为了提示其真正作用,真正设置频率需要在settings.py文件里面配置
        scope = 'three'
        # 取到当前用户缓存的key
        def get_cache_key(self, request, view):
            # 这里的返回值注意,要返回一个跟当前用户相关的值,不能返回一个固定的值,除非是针对游客所定义的频率类
            return 'throttle:user_%s' % (request.user.id)
    

    三种组件的配置

    三种组件的全局配置如下:

    # settings.py
    REST_FRAMEWORK = {
        # 认证模块
        'DEFAULT_AUTHENTICATION_CLASSES': [
         'rest_framework.authentication.TokenAuthentication',
        ],
        
        # 权限模块
        'DEFAULT_PERMISSION_CLASSES': [
            'rest_framework.permissions.IsAuthenticated',
        ],
        
        # 频率设置
        'DEFAULT_THROTTLE_RATES': {
            # 这里前一个字段时我们在throttles.py文件里定义的scope字段,后面就是真正的频率设置
            # 要注意的是,频率设置/后面的部分其实只取到第一个字符,后面的字符都没有作用,只凭第一个字符来从字典里面取值,具体的配置在源码里面,位置为 rest_framework	hrottling.py里面的parse_rate方法,就是解析配置项,默认如下:
            # 	duration_dic = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400},s是每秒秒,m是每分钟,h是每小时,d是每天
            'three': '3/min',
        },
    }
    

    如果需要局部配置的话,只需要在需要使用的views.py文件中相应的方法中加入即可,比如:

    class UserCenterAPIView(APIView):
        # 认证模块局部配置,为空即是清空配置
        authentication_classes = []
        
        # 权限模块局部配置
        permission_classes = [IsAuthenticated]
        
        # 频率模块局部配置
        throttle_classes = [ThreeTimeUserThrottle]
    
        def get(self, request, *args, **kwargs):
            pass
    
  • 相关阅读:
    jQuery之父:每天都写点代码
    XtraTabControl 控件使用
    Linq:使用Take和Skip实现分页
    WCF教程一之WCF是什么,能做什么
    WCF发布后远程访问的域名解析问题
    C# WinForm下,隐藏主窗体,只在进程管理器中显示进程,在任务栏,状态栏都不显示窗体的方法
    在bat脚本写入中文远行后乱码
    VS2010DebugView捕捉
    Web Service 的工作原理
    String.Format 方法
  • 原文地址:https://www.cnblogs.com/Xu-PR/p/11937803.html
Copyright © 2020-2023  润新知