首页 > 其他 > 详细

DRF之认证组件

时间:2019-10-21 22:10:24      阅读:70      评论:0      收藏:0      [点我收藏+]

一:源码分析

(1)认证组件

(1)视图

APIView的dispath(self, request, *args, **kwargs)   

(2)任务分发

dispath方法内 self.initial(request, *args, **kwargs) 进入三大认证

(3)认证组件

   self.perform_authentication(request)

(4)认证功能介绍

  (1)其主要用来对用户进行认证

  (2)检验用户 ----> 普通游客 | 合法用户 | 非法用户

  (3)游客:代表认证通过 直接进入下一步(权限校验)

  (2)合法用户:携带验证信息进行验证 验证通过将用户存储进入request.user中 再次进行下一步校验

  (3)非法用户:携带验证信息进行验证 验证失败直接抛出异常 返回403权限问题

(2)源码分析

(1)第一步APIView/dispatch/initial

 def initial(self, request, *args, **kwargs):# Ensure that the incoming request is permitted
        self.perform_authentication(request) # 认证功能
        self.check_permissions(request)      # 访问权限功能
        self.check_throttles(request)       # 频率功能

(2)第二步进入认证功能

   def perform_authentication(self, request):

        request.user   # 得到一个方法属性 get方法
     PS: 如果是复制属性 应该是request.user = XXX

(3)第三步进入request/user

    @property
    def user(self):
        if not hasattr(self, _user):
            with wrap_attributeerrors():
                self._authenticate()     # 没有用户认证处用户
        return self._user  # 如果有直接返回用户

(4)第四步_authenticate

    def _authenticate(self):
        # self.authenticators:一堆认证类产生序列化认证对象的集合体(列表)
        for authenticator in self.authenticators:   # 循环遍历集合体拿到一个个认证对象
            try:
                ‘‘‘
                authenticator.authenticate:认证对象调用认证功能
                user_auth_tuple:拿到登录的用户与用户信息的返回值
                
                调用改方法传入两个参数 self,request
                self:当前认证类对象
                request:当前请求用户
                
                ‘‘‘
                user_auth_tuple = authenticator.authenticate(self)
            except exceptions.APIException:
                # 抛出异常代表认证失败
                self._not_authenticated()
                raise

            if user_auth_tuple is not None:
                self._authenticator = authenticator
                # 如果有返回值 将登录用户 与 验证信息 保存在 request.user ,request.author
                self.user, self.auth = user_auth_tuple

                return
        # 如果返回值为空 代表认证通过 但是没有登录用户 与验证信息 表示当前用户为游客用户
        self._not_authenticated()

(5)自定义认证组件

(1)全局settings文件配置

REST_FRAMEWORK = {
    # 全局配置异常模块
    EXCEPTION_HANDLER: utils.exception.exception_handler,
    # 认证类配置
    DEFAULT_AUTHENTICATION_CLASSES: [
        # ‘rest_framework.authentication.SessionAuthentication‘,
        # ‘rest_framework.authentication.BasicAuthentication‘,
        api.authentications.MyAuthentication,  # 自定义认证组件
    ],
    # 权限类配置
    DEFAULT_PERMISSION_CLASSES: [
        rest_framework.permissions.AllowAny,
    ],
}

(2)自定义文件配置api/Authentication

from rest_framework.exceptions import AuthenticationFailed
from rest_framework.authentication import BaseAuthentication
from . import models
class MyAuthentication(BaseAuthentication):
    def authenticate(self, request):
        ‘‘‘
        前台在请求头携带认证信息,
        且默认规范用 Authorization 字段携带认证信息,
        后台固定在请求对象的META字段中 HTTP_AUTHORIZATION 获取

        ‘‘‘
        auth = request.META.get(HTTP_AUTHORIZATION,None)   # 可以不携带认证信息

        if auth is None:  # 如果为空则表明游客
            return None  # 没有登录用户 与 返回信息

        auth_list = auth.split()  # 设置认证小规则(两段式)

        # 判断用户是否合法
        if not (len(auth_list) == 2 and auth_list[0].lower() == auth):
            raise AuthenticationFailed(认证信息有误 非法用户)  # 非法的请求 直接抛出异常

        # 解析合法的用户
        if not auth_list[1] == qwe.asd.zxc:   # 假设通过解析‘qwe.asd.zxc‘ 可以解析处合法用户
            raise AuthenticationFailed(用户校验失败 非法用户)

        user_obj = models.User.objects.filter(username=admin).first()
        if not user_obj:
            raise AuthenticationFailed(用户数据有误 非法用户)
        return (user_obj,None)   # 合法将用户返回 验证信息不返回

(3)视图层

from rest_framework.views import APIView
from rest_framework.response import Response

class TestAPIView(APIView):
    def get(self,request,*args,**kwargs):
        ‘‘‘
        测试一:前段不输入校验信息 获取用户属于匿名用户
        测试二:前段加入验证信息  获取用户属于解析用户 admin
        ‘‘‘
        print(request.user)
        return Response(
            {
                status:0,
                msg:测试成功
            }
        )

 

 

  

 

DRF之认证组件

原文:https://www.cnblogs.com/SR-Program/p/11715901.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!