认证源码分析

位置 :

APIVIew—-》dispatch方法—》self.initial(request, *args, **kwargs)—->有认证,权限,频率三个版块

分析:

只读认证源码: self.perform_authentication(request)—》
self.perform_authentication(request)就一句话:request.user,需要去drf的Request对象中找user属性(方法)—》
Request类中的user方法,刚开始来,没有_user,走 self._authenticate()
image

核心:Request类的 _authenticate(self):

1.在需要进行认证的视图类中添加(认证类是自己写的类,该类继承了BaseAuthentication):

image

2.此时apiview里的 authentication_classes就变成了自己第一步在视图函数类里定义的了,而不会去自己的配置文件里找

image

3.然后正常执行到apiview里的dispatch方法:

image

4.dispatch方法内部又调用了initialize_request方法,返回了一个新的request对象

image

5.authenticators这个的值是get_authenticators()方法的返回值:返回值是一个个自己定义的继承了BaseAuthentication类的认证类对象

image

6.Request类中的authenticators变成了自定义类的对象

image

7.在继续走apiview里的dispatch方法里的initial方法

image

8.进入认证模块的方法

image

9.进入新封装request对象里
image

image

10.核心_authenticate方法

def _authenticate(self):
    # self是Request对象,所以去Request对象里找authenticators,
    # 最后self.authenticators的结果就是一个列表,列表里面是一个个自定义认证类的对象
    for authenticator in self.authenticators:
        try:
            # 此时authenticator就是认证类的对象,对象调用了authenticate方法,这个方法是需要我们在认证类里重新写的
            # 这个方法有两个返回值
            user_auth_tuple = authenticator.authenticate(self)
        except exceptions.APIException:
            self._not_authenticated()
            raise

        if user_auth_tuple is not None:
            self._authenticator = authenticator
            # 这两个返回值给了Request对象,就是request.user和request.auth(这就是为什么要求自己重新写的authenticate方法要有两个返回值了)
            self.user, self.auth = user_auth_tuple
            return

    self._not_authenticated()

原文地址:http://www.cnblogs.com/suncolor/p/16826105.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性