美文网首页
DRF部分源码解析之认证

DRF部分源码解析之认证

作者: 清风徐来_简 | 来源:发表于2019-05-26 11:41 被阅读0次

认证是最基本的限制,根据访问者是否为有效用户,从而限制可以访问什么资源。权限是在认证基础上做的进一步限制,也就是说只有通过了认证才谈得来有什么权限,根据不同的身份,限制不同的访问。

  • 1、一句 self.initial(request, *args, **kwargs)就执行了认证、权限、频率三件事情,三件事都走完之后才往下走,执行相应的函数

    def initial(self, request, *args, **kwargs):
        1,实现认证
        self.perform_authentication(request)
        2,权限判断
        self.check_permissions(request)                    
        3,控制访问频率
        self.check_throttles(request)
    
  • 2、先看认证 self.perform_authentication(request)

    • ①,request.user

      def perform_authentication(self, request):
          request.user  【在Request类里寻找user方法】
        【此时的request.user是request原有的user方法,之后步骤⑥自己赋值了一个request.user是表中的user对象】
      
    • ②,这个user方法返回了一个_user属性

      @property
      def user(self):
          if not hasattr(self, '_user'):
              with wrap_attributeerrors():
                  self._authenticate()  【此句是认证关键】
          return self._user
      
    • ③,认证的全部代码。【Request类里的。】

      def _authenticate(self):
          # 循环认证类的所有对象
          for authenticator in self.authenticators:  【解析第一句】authenticator是认证类对象, 这个self是新的request对象
              try:
             【# 对应自己的逻辑结果,下面这句话限制了自己写的代码,如果不符合要求可以抛错,我下面给你抛出去,结束本次访问。】
              ↓   user_auth_tuple = authenticator.authenticate(self) 【解析第二句】
              except exceptions.APIException: 【authenticate 是自定义的 一个函数,所以自定义的一个函数里必须接收一个request参数】
                  self._not_authenticated()
                  raise
              if user_auth_tuple is not None: 【解析第三句】
                  self._authenticator = authenticator
                  self.user, self.auth = user_auth_tuple
                  return
          self._not_authenticated()
      
    • ④,解析第一句,实例化的时候:

      Request(authenticators=self.get_authenticators(),)
      这个方法返回一个认证类对象列表:
      def get_authenticators(self):  【dispatch中的视图类对象】
          return [auth() for auth in self.authentication_classes]
      此时就用到了自定义的认证类。
      
      authenticator是自定义类的实例对象,authenticate是自定义类的方法,那个self是新的request对象
      调方法的时候调了一个authenticate方法,所以自定义方法的名字必须叫这个。
      
    • ⑤,解析第三句,代码意思:如果上面的执行结果不报错,就是正常可以访问,走下来,之后再判断执行的结果是什么【先看执行报不报错,不报错再看执行结果是什么】

      if user_auth_tuple is not None:       【如果有返回值,也就是返回不为None,就走这一步】
           self._authenticator = authenticator
           self.user, self.auth = user_auth_tuple  【将返回值赋值给这两个属性】
           return  【直接结束】return就结束了for循环,这就限制了如果有多个认证类,
      想要返回结果就必须把有返回结果的认证类放在最后
      【没有返回值,才不走return】
      
  • 3、rest_framwork 里面有认证部分,只不过不写就全部通过,实际还是走认证的代码。

    如果我把我的认证部分的代码放进他给提供的接口里,就会按我写的认证逻辑走。意思是,我按照人家的规则放进去我自己的认证逻辑代码,人家就接收,并且按我的逻辑走。自定义认证类的使用流程

  • 4、当然restframework里面还提供了一些认证类,提供了不同的认证方法。我们自己写的认证是根据token值认证,当然也可通过用户名等。
  • 5、如果想要全局,所有视图都经过认证,可把这个认证类放在settings文件里,所有的视图在走自己的逻辑时必须经过找认证类这个步骤,找不到自己的里面自然会去settings里找,最后才找默认的(在此默认的是全部通过,不做约束)。
    注意写好路径。
    REST_FRAMEWORK={
    
        'DEFAULT_PARSER_CLASSES': (
            'rest_framework.parsers.JSONParser',
            'rest_framework.parsers.FormParser',
        ),
    
       'DEFAULT_AUTHENTICATION_CLASSES': (
            'app01.utils.auth_class.UserAuth',
        ),
    
        'DEFAULT_PERMISSION_CLASSES': (
             'app名称.下的路径.权限类',
        ),
    }
    

相关文章

网友评论

      本文标题:DRF部分源码解析之认证

      本文链接:https://www.haomeiwen.com/subject/hoyxtctx.html