zoukankan      html  css  js  c++  java
  • django-restframework认证功能等相关内容-86

    1 drf认证功能介绍

    0 认证,频率,权限
    1 用户是否登录到系统中
    2 后期基本上会用JWT的认证
    3 自定制的认证

     

    2 认证功能源码分析

    1 APIView---》dispatch---》self.initial(request, *args, **kwargs)--》self.perform_authentication(request)---》Request.user--->self._authenticate(self):Request类的方法---》self.authenticators:Request类的属性---》在Request对象实例化的时候传入的----》Request在什么时候实例化的?dispatch的时候---》APIView:self.get_authenticators()--》return [auth() for auth in self.authentication_classes]----》如果在自己定义的视图类中写了authentication_classes=[类1,类2]----》Request的self.authenticators就变成了我们配置的一个个类的对象
           
           
    2 self._authenticate(self):Request类的方法
    def _authenticate(self):
        for authenticator in self.authenticators: # BookView中配置的一个个类的对象
               try:
                   user_auth_tuple = authenticator.authenticate(self)
               except exceptions.APIException:
                   self._not_authenticated()
                   raise

               if user_auth_tuple is not None:
                   self._authenticator = authenticator
                   self.user, self.auth = user_auth_tuple
                   return
    3 只要在视图类中配置authentication_classes = [MyAuthen.LoginAuth, ]
    就会执行上面的方法,执行认证

     

    3 自定义认证类(重点)

    1 使用
    -定义一个类,继承BaseAuthentication
    class LoginAuth(BaseAuthentication):
           def authenticate(self, request):
               token = request.GET.get('token')
               res = models.UserToken.objects.filter(token=token).first()
               if res:
                   return 元组
               else:
                   raise AuthenticationFailed('您没有登录')
       -重写authenticate方法
       -局部使用和全局使用
           -局部:在视图类中配置(只要配置了,就是登录以后才能访问,没配置,不用登录就能访问)
               authentication_classes = [MyAuthen.LoginAuth, ]
           -全局
           REST_FRAMEWORK = {
           "DEFAULT_AUTHENTICATION_CLASSES": ["app01.MyAuthen.LoginAuth", ]
          }
           
      -注意:
    1 认证类,认证通过可以返回一个元组,有两个值,第一个值会给,request.user,第二个值会个request.auth
       2 认证类可以配置多个,按照从前向后的顺序执行,如果前面有返回值,认证就不再继续往下走了

     

    4 认证功能局部使用和全局使用

    1 全局使用(所有接口,都需要登录才能访问)
    -在配置文件中
           REST_FRAMEWORK = {
           "DEFAULT_AUTHENTICATION_CLASSES": ["app01.MyAuthen.LoginAuth", ]
          }
    2 局部使用
    -在想局部使用的视图类上
    authentication_classes = [MyAuthen.LoginAuth,]
    3 局部禁用
    -在想禁用的视图类上
       authentication_classes = []
       

     

     

     

    5 自定义权限功能(重点)

    1 登录成功以后,超级用户可以干某些事,普通用户不能干---》超级用户可以查看某些接口,普通用户不能查看


    2 使用写一个类继承BasePermission,重写has_permission
       class SuperPermission(BasePermission):
           def has_permission(self, request, view):
               # Return `True` if permission is granted, `False` otherwise.
               # 超级用户可以访问,除了超级用户以外,都不能访问
               if request.user.user_type == '1':
                   return True
               else:
                   return False
               
    3 局部使用和全局使用
    -在想局部使用的视图类上
    permission_classes = [MyAuthen.SuperPermission]
       -全局使用
         REST_FRAMEWORK = {
           "DEFAULT_PERMISSION_CLASSES": ["app01.MyAuthen.SuperPermission", ]
          }
        -局部禁用
       permission_classes = []

     

    6 权限功能局部使用和全局使用

    1 使用方式
       -在想局部使用的视图类上
    permission_classes = [MyAuthen.SuperPermission]
       -全局使用
         REST_FRAMEWORK = {
           "DEFAULT_PERMISSION_CLASSES": ["app01.MyAuthen.SuperPermission", ]
          }
        -局部禁用
       permission_classes = []

     

     

    7 内置的权限和认证类

    # 内置认证类
    from rest_framework.exceptions import AuthenticationFailed
    # 内置权限类
    from rest_framework.permissions import BasePermission
  • 相关阅读:
    js,JavaScript,a标签onclick传递参数不对,A标签调用js函数写法总结
    Java两大测试方法Junit和TestNG的比较
    java简单的测试方法执行了多少时间
    利用Chrome的Performance工具排查页面性能问题(原叫timeline)
    P3317 [SDOI2014]重建(Matrix-tree+期望)
    P2221 [HAOI2012]高速公路(线段树)
    P2473 [SCOI2008]奖励关(期望)
    P3302 [SDOI2013]森林(主席树+启发式合并)
    bzoj3932 / P3168 [CQOI2015]任务查询系统(主席树+差分)
    P2219 [HAOI2007]修筑绿化带(单调队列)
  • 原文地址:https://www.cnblogs.com/usherwang/p/14271076.html
Copyright © 2011-2022 走看看