三大认证源码分析

Posted setcreed

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三大认证源码分析相关的知识,希望对你有一定的参考价值。

认证组件

通过dispath方法,进入三大认证:

技术图片

首先看一下请求模块,进入request

技术图片

进入get_authenticators 方法

技术图片

可以知道,请求模块二次封装request对象,包含解析模块,还将认证类们的对象存储在请求对象中。

进入三大认证

技术图片

技术图片

技术图片

遍历一个个认证器,完成一个个认证类,每一个配置的认证类都要调用authenticate方法完成认证。返回值是user和auth组成的元组。

技术图片

权限组件

技术图片

技术图片

频率组件

通过dispatch方法 进入频率组件

技术图片

然后看SimpleRateThrottle类,有allow_request和 wait 方法。SimpleRateThrottle继承BaseThrottle,BaseThrottle也有allow_request和 wait两个方法,但它没写,需要自己写。

所以我们继承SimpleRateThrottle类,它帮我们写了allow_request和 wait两个方法

技术图片

技术图片

技术图片

# 可以直接在自定义频率类中配置rate,这就是要动源码了
rate = '3/min'

# 但是推荐在自定义频率类中配置scope属性,然后再在settings文件中设置scope
class MobileReateThrottle(SimpleRateThrottle):
    scope = 'mobile'
    def get_cache_key(self, request, view):
        if not request.user.is_authenticated or not request.user.mobile:
            return None   # 匿名用户   没有电话号的用户都不限制
        
        return self.cache_format % {
            'scope': self.scope,
            'ident': request.user.mobile
        }
    

# settings文件
REST_FRAMEWORK = {
    # 频率组件,频率类一般做局部配置,但是频率调节在settings中配置
    'DEFAULT_THROTTLE_RATES': {
        'user': '5/min',   # 登录用户限制
        'anon': '3/min',   # 匿名用户限制,
        'mobile': '1/min'
    },

}

技术图片

技术图片

来到上面的__init__方法中

技术图片

回到allow_request

技术图片

cache.set(key, value, exp) 设置过期缓存,exp设为0,代表缓存不过期

请求一次,将时间保存一次,保存在self.history中

根据请求时间形成的列表长度判断是否限次

技术图片

技术图片

技术图片

进入wait方法

技术图片

以上是关于三大认证源码分析的主要内容,如果未能解决你的问题,请参考以下文章

drf三大认证:认证组件-权限组件-权限六表-自定义认证组件的使用

drf三大认证

drf三大认证补充

?DRF?-----三大认证组件--认证组件

drf之三大认证

三大认证之认证组件和权限组件