drf框架认证组件(代码片段)

st-st st-st     2023-02-04     624

关键词:

DRF框架的认证组件

核心代码:       self.perform_authentication(request) 

框架自带模块:    from rest_framework import authentication

 

认证组件的返回值:request.user

自定义的认证组件的钩子方法authenticator.authenticate(self) ;返回值是元组(user,auth)

 

from rest_framework import authentication

from rest_framework import authentication


class BaseAuthentication(object):
    def authenticate(self, request):
        # 必须重写该方法,返回元组(user,auth)
        return (user_obj,token)


class BasicAuthentication(BaseAuthentication):


class SessionAuthentication(BaseAuthentication):


class TokenAuthentication(BaseAuthentication):
    

class RemoteUserAuthentication(BaseAuthentication):


基于BaseAuthentication类的认证
# myauth.py


from rest_framework import authentication
from AuthDemo.models import UserTable
from rest_framework.exceptions import AuthenticationFailed      # 用于抛出异常


# 基于BaseAuthentication类的认证
class AuthoDemo(authentication.BaseAuthentication):
    ‘‘‘验证GET请求是否携带Token‘‘‘
    def authenticate(self, request):
        # 通过/user/test/?token="xxx" 获取token
        token = request.query_params.get("token","")
        # 如果token不存在
        if not token:
            # 抛出异常
            raise AuthenticationFailed("token不存在")

        # token存在,验证token
        user_obj = UserTable.objects.filter(token=token).first()
        if user_obj:
            # 验证通过,必须返回元组,(user,token)
            return (user_obj,token)
        # 认证不通过抛出异常
        raise AuthenticationFailed("token错误")
# views.py

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import UserTable
import uuid
from utils.myauth import AuthoDemo
from rest_framework import authentication

# Create your views here.

# 注册视图
class RegisterView(APIView):
    def post(self,request):
        # 获取提交的用户名和密码
        username = request.data.get(username)
        password = request.data.get(password)

        # 创建对象
        UserTable.objects.create(username=username,password=password)

        # 返回结果
        return Response("注册成功!")

# 登陆视图
class LoginView(APIView):
    def post(self,request):
        # 获取提交的用户名和密码
        username = request.data.get(username)
        password = request.data.get(password)
        # 验证用户名密码是否正确
        user_obj = UserTable.objects.filter(username=username,password=password).first()
        if user_obj:
            # 验证通过,写入Token并保存
            token = uuid.uuid4()
            user_obj.token = token           # 为对象的token字段写入随机字符串
            user_obj.save()
            # 返回token
            return Response(token)
        else:
            return Response("用户名密码不正确")


# 认证的测试视图
class TestView(APIView):
    authentication_classes = [AuthoDemo,]
    def get(self,request):
        print(request.user)             # 获取用户对象
        print(request.auth)             # 获取token
        print(request.user.username)    # 获取用户对象的名字
        return Response("认证测试接口")

 

 

源码流程

# 1、封装request对象
def dispatch(self, request, *args, **kwargs):
    request = self.initialize_request(request, *args, **kwargs)

# 1.1
def initialize_request(self, request, *args, **kwargs):
    parser_context = self.get_parser_context(request)
    return Request(
        request,
        parsers=self.get_parsers(),
        # 返回认证类的实例化对象列表:[auth() for auth in self.authentication_classes]
        authenticators=self.get_authenticators(),
        negotiator=self.get_content_negotiator(),
        parser_context=parser_context
    )


# 1.2
class APIView(View):
    authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES


from rest_framework import authentication  # 查看自带的认证类


class ApiView(View):
    # 2、认证组件
    self.perform_authentication(request)
    # 权限组件
    self.check_permissions(request)
    # 节流组件
    self.check_throttles(request)
  
    
# 2.1、开始认证
def perform_authentication(self, request):
    request.user


# 2.2、调用Request.user
class Request(object):
    def __init__(self, request, authenticators=None):
        self.authenticators = authenticators or ()

    @property
    def user(self):
        if not hasattr(self, _user):
            with wrap_attributeerrors():
                # 2.3、
                self._authenticate()  
        return self._user   


# 2.3、读取认证对象列表
def _authenticate(self):
    for authenticator in self.authenticators:
        try:
            # 对每个进行验证,异常则全部终止,若返回None,则继续循环
            user_auth_tuple = authenticator.authenticate(self)
            
        except exceptions.APIException:
            self._not_authenticated()
            raise

        if user_auth_tuple is not None:
            # 给request赋值user
            self._authenticator = authenticator
            self.user, self.auth = user_auth_tuple
            # 通过直接退出循环
            return
    
    # 全都没有通过则设置匿名用户
    self._not_authenticated()


# 认证类实例
class BasicAuthentication(BaseAuthentication):
    def authenticate(self, request):
        """
        Returns a `User` if a correct username and password have been supplied
        using HTTP Basic authentication.  Otherwise returns `None`.
        """
        pass
        return self.authenticate_credentials(userid, password, request)
        
     def authenticate_credentials(self, userid, password, request=None):
        """
        Authenticate the userid and password against username and password
        with optional request for context.
        """
        user = authenticate(request=request, **credentials)

        if user is None:
            raise exceptions.AuthenticationFailed(_(Invalid username/password.))

        if not user.is_active:
            raise exceptions.AuthenticationFailed(_(User inactive or deleted.))
            
        return (user, None)

 








drf认证组件权限组件jwt认证签发jwt框架使用(代码片段)

...user对象九、drf项目的jwt认证开发流程(重点)十、drf-jwt框架基本使用安装(终端)签发token校验token(认证组件)设置需要登录才能访问的接口进行测试(views.py)测试访问登录认证接口(Postman)一、注册接口urls.pyrouter.register('... 查看详情

drf框架知识总览(代码片段)

DRF框架知识总览"""1)接口(api):什么是接口接口文档接口规范2)FBV=>CBV:Function|ClassBaseViewCBV的请求生命周期CBV比FBV的优势3)drf框架的基础试图类APIView:请求模块、解析模块、渲染模块、响应模块、异常模块4)drf... 查看详情

drf认证--2019-08-0818:02:57(代码片段)

目录认证组件的详细用法原文:http://106.13.73.98/__/65/本文详细讲述了DRF认证组件的原理以及用法.@*源码剖析**上一篇博客讲解DRF版本的时候我们都知道了,在dispatch方法里执行了initial方法来初始化我们的版本.而在initial方法里有我... 查看详情

drf-jwt认证组件权限组件频率组件的使用(代码片段)

目录drf-jwt认证组件、权限组件、频率组件的使用认证组件权限组件频率组件drf-jwt签发token源码分析自定义签发token实现多方式登录源码分析多方式登陆签发token实例频率组件自定义频率类drf-jwt认证组件、权限组件、频率组件的使... 查看详情

drf08(代码片段)

目录三大认证流程认证组件权限组件频率组件自定义token的签发三大认证流程由于DRF中,所有的视图类都要直接和间接继承APIView类,也只有APIView类中才有dispatch方法,所以所有的请求都要经过三大认证,认证通过后执行相应请求的视... 查看详情

79-drf三大认证的配置及使用方法(代码片段)

...块身份认证组件一般都配置在全局settings中。#settings.py#drf框架自定义配置REST_FRAMEWORK=#认证组件'DEFAULT_AUTHENTICATION_CLASSES':[#'rest_framework.authentication.SessionAuthentication',#'rest_framework.authentication.BasicAuthentication''rest_f... 查看详情

drf框架6视图集与路由组件(开发最常用最高级)三大认证原理rbac认证规则(代码片段)

准备工作models.pyfromdjango.dbimportmodels#基类:是抽象的(不会完成数据库迁移),目的是提供共有字段的classBaseModel(models.Model):is_delete=models.BooleanField(default=False)updated_time=models.DateTimeField(auto_now_add=True)classMeta:abstract=True#必须完成该配置... 查看详情

drf三大认证:认证组件-权限组件-权限六表-自定义认证组件的使用(代码片段)

...:Role-Based-Access-Control;基于auth的认证规则(了解)。Django框架采用的是RBAC认证规则:通常分为:三表规则、五表规则、Django采用的是六表规则。三表:用户表、角色表、权限表五表:用户表、角色表、权限表、用户角色关系表... 查看详情

django-rest-framework---总结(代码片段)

目录drf回顾总结drf基础1.drf框架安装2.接口3.restful接口规范4.基于restful规范的原生Django接口drf五大模块1.请求模块:request对象2.渲染模块:浏览器和Postman请求结果渲染数据的方式不一样3.解析模块4.异常模块5.响应模块序列化组件... 查看详情

drf之版本控制认证和权限组件(代码片段)

一、版本控制组件1、为什么要使用版本控制首先我们开发项目是有多个版本的当我们项目越来越更新,版本就越来越多,我们不可能新的版本出了,以前旧的版本就不进行维护了像bootstrap有2、3、4版本的,每个版本都有它对应... 查看详情

drf-路由和认证(代码片段)

...rf-路由目录drf-路由1路由1.1路由router的使用1.2action的使用2认证2.1认证的写法2.2源码分析2.3认证组件的使用1路由针对视图集ViewSet,我们出来可以自己手动指明请求方式与执行函数间的对应关系,还可以使用Routers来快速实现路由信... 查看详情

drf权限频率(代码片段)

...限~~权限是我们在项目开发中非常常用到的~~那我们看DRF框架给我们提供的权限组件都有哪些方法~~权限组件源码我们之前说过了DRF的版本和认证~也知道了权限和频率跟版本认证都是在initial方法里初始化的~~其实我们版本,认证... 查看详情

drf权限频率(代码片段)

...限~~权限是我们在项目开发中非常常用到的~~那我们看DRF框架给我们提供的权限组件都有哪些方法~~权限组件源码我们之前说过了DRF的版本和认证~也知道了权限和频率跟版本认证都是在initial方法里初始化的~~其实我们版本,认证... 查看详情

drf框架——drf-jwt手动签发与校验过滤组件筛选组件排序组件分页组件(代码片段)

自定义drf-jwt手动签发和校验签发token源码入口前提:给一个局部禁用了所有认证与权限的视图类发送用户信息得到token,其实就是登录接口,不然进不了登录页面获取提交的username和password1)rest_framework_jwt.views.ObtainJSONWebToken的父... 查看详情

drf认证权限频率(代码片段)

目录一认证Authentication认证源码分析自定义认证方案二权限Permissions源码分析使用内置提供的权限举例自定义权限三限流Throttling使用实列可选限流类实例自定义频率类一认证Authentication认证组件:校验用户-游客、合法用户、非法... 查看详情

drf框架之serializers序列化组件(代码片段)

...学了序列化工具json工具,就是吧信息存为类字典形式2.DRF框架自带序列化的工具:serializers 3.DRF框架serializers分为:第一种Serializer 第二种ModelSerializer 第一种用法之Serializerfromdjango.dbimportmodels#Createyourmod 查看详情

drf框架8系统权限类使用用户中心信息自查token刷新机制认证组件项目使用:多方式登录权限组件项目使用:vip用户权限频率组件异常组件项目使用(代码片段)

系统权限类使用图书接口:游客只读,用户可增删改查权限使用fromrest_framework.permissionsimportIsAuthenticatedOrReadOnlyclassBookViewSet(ModelViewSet):#游客只读,用户可增删改查permission_classes=[IsAuthenticatedOrReadOnly]queryset=models.Book.objects.all()seriali... 查看详情

drf--频率组件jwt使用(代码片段)

...uest,*args,**kwargs)点进去#2)self.check_throttles(request)进行频率认证#频率组件核心源码分析defcheck_throttles(self,request):throttle_durations=[]#1)遍历配置的频率认证类,初始化得到一个个频率认证类对象(会调用频率认证类的__init__()方法)#2... 查看详情