首页 > 其他分享 >drf认证功能

drf认证功能

时间:2024-01-10 17:25:53浏览次数:25  
标签:功能 self rest 认证 framework authentication import drf

自定义认证类 (登录)


1 使用
from  app03 import models
from rest_framework.exceptions import AuthenticationFailed,PermissionDenied,Throttled
#AuthenticationFailed登录认证报错,PermissionDenied权限不通过,Throttled频率太快不允许
from rest_framework.authentication import BaseAuthentication

-定义一个类,继承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 认证类可以配置多个,按照从前向后的顺序执行,如果前面有返回值,认证就不再继续往下走了


url.py:
path('books/',views.BookView.as_view()),

 

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

1 全局使用(所有接口,都需要登录才能访问)
    -在配置文件中
        REST_FRAMEWORK = {
        "DEFAULT_AUTHENTICATION_CLASSES": ["app01.MyAuthen.LoginAuth", ],
      #后续需要加全局认证 直接在这里后面加上即可,k值在
        #from rest_framework.views import APIView中的APIView的源码中可以拿到,
        例如超级用户权限认证:
    "DEFAULT_PERMISSION_CLASSES": ["app名.文件名.类名", ], }
2 局部使用 -在想局部使用的视图类上 authentication_classes = [MyAuthen.LoginAuth,] 3 局部禁用     -在想禁用的视图类上 authentication_classes = []

 

认证功能源码分析

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, ]
    就会执行上面的方法,执行认证

 

自定义权限功能

from  app03 import models
from rest_framework.exceptions import AuthenticationFailed,PermissionDenied,Throttled
#AuthenticationFailed登录认证报错,PermissionDenied权限不通过,Throttled频率太快不允许
from rest_framework.authentication import BaseAuthentication

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



2 使用写一个类继承BasePermission,重写has_permission

from rest_framework.permissions import BasePermission
class SuperPermission(BasePermission):
    def has_permission(self,request,view):
        #超级用户可以访问 除开超级用户都不能访问
        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 = []

 

内置的权限和认证类

# 内置认证类
from rest_framework.exceptions import AuthenticationFailed
# 内置权限类
from rest_framework.permissions import BasePermission

 

 

1 select_related的使用
articleList=models.Article.objects.select_related("category").all()
for article_obj in articleList:
        #  Doesn't hit the database, because article_obj.category
        #  has been prepopulated in the previous query.
        #不再查询数据库,因为第一次查询,数据已经填充进去了
        print(article_obj.category.title)

 

标签:功能,self,rest,认证,framework,authentication,import,drf
From: https://www.cnblogs.com/97zs/p/17956911

相关文章

  • MySQL运维实战(2.4) SSL认证在MySQL中的应用
    作者:俊达引言MySQL支持使用TLS协议进行通信,该协议在数据库通信中具有关键作用。首先,TLS能够加密客户端与服务端之间的通信数据,涵盖了客户端发送至服务端的SQL请求以及服务端返回给客户端的数据,从而确保敏感信息的保密性和完整性。除此之外,TLS还允许客户端验证服务端的身份,确保安......
  • Linux中yum有何作用?主要功能是什么?
    Linux系统中的yum想必大家都听说过,甚至不少运维小伙伴都经常用到这个功能,但不少初学者对它了解的还不是很多,不知道yum是什么,以及它有哪些作用,本文为大家介绍一下,具体请看下文。在Linux中,yum是一个包管理器,用于管理和安装软件包。它是YellowdogUpdater,Modified的缩写,最初......
  • 华为认证 | HCIP-Storage V5.5 认证正式发布!
    华为认证存储高级工程师HCIP-StorageV5.5(中文版)自2023年12月28日起正式在中国区发布。01发布概述基于“平台+生态”战略,围绕“云-管-端”协同的新ICT技术架构,华为公司打造了覆盖ICT领域的认证体系,包含ICT基础设施认证、基础软硬件认证、云平台及云服务认证三类认证。根据ICT从业......
  • 每日一练 | 华为认证真题练习Day162
    1、在路由器间使用缺省路由,是一种低成本的解决方案,但是比完整的路由表需要的系统资源更多。A.正确B.错误2、AS边界路由器可以是内部路由器IR或者是ABR,必须属于骨干区域。A.正确B.错误3、OSPFDR-PRIORITY命令默认值为1,取值范围为0-255。A.正确B.错误4、BGP邻居是通过UDP建立......
  • 网工内推 | 上市公司网工,NP认证优先,最高15薪+项目奖金
    01广东轩辕网络科技股份有限公司招聘岗位:网络工程师职责描述:1、主要负责教育行业园区网的有线及无线网络项目的实施、维护、巡检等工作;2、协助windows/linux平台服务器OS的安装、部署、配置与维护;3、协助服务器、存储、虚拟化新建及扩容项目的安装调试、日常故障处理、巡检及技术......
  • 【golang】GO之认证与授权
    一般公司项目比较多,比较分散,但是对于都是公司的用户来说,用户数据一般是共享的,所以集成统一认证与授权的功能一般就必不可少,这样可以实现一个用户,分配一点权限,能访问公司很多项目.一般的认证与授权方案有OAuth、分布式Session、OpenID和JWT等.目前常用的是OAuth2,其......
  • 2024年1月深圳CPDA数据分析师认证大家都来这报名
    CPDA数据分析师认证是大数据方面的认证,助力数据分析人员打下扎实的数据分析基础知识功底,为入门数据分析保驾护航。帮助数据分析人员掌握系统化的数据分析思维和方法论,提升工作效率和决策能力,遇到问题能够举一反三,为大部分决策难题提供解决方案。帮助数据分析人员掌握几种通用的数据......
  • 2024年1月DAMA-CDGP数据治理专家认证可以先报名及备考
    DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业竞争能力。DAMA是数据管理方面的认证,帮助数据从业者提升......
  • 2024年1月DAMA-CDGA/CDGP数据治理认证报名流程及备考
    DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业竞争能力。DAMA是数据管理方面的认证,帮助数据从业者提升......
  • 弘博创新PMP®项目管理认证面授课开课啦!学员学习热情高涨
    为了迎接2024年3月10日的PMP®认证考试,弘博创新2024年第一季度的PMP®项目管理认证面授课程于2024年1月6、7日正式开班,来自不同的行业和领域学员们积极参加培训学习,同时也吸引了多名对项目管理感兴趣的小伙伴前来试听。 本次课程由行业资深项目管理专家岳建伟老师授课,岳老师上课形......