rest framework之认证基本流程源码分析

今日内容:

1、认证

       a. 问题:有些API需要用户登录成功之后,才能访问:有些无需登录就能访问。

       b.基本使用认证组件

        解决:

               a.创建两张表:一张用户表,一张存用户登录成功的的token的表

 

               b.用户登录(返回到token并将token保存到数据库)

   c.认证流程原理如下如下图所示:

 

 

 

 

 

 

 

 

 

 

 否则抛出异常,页面显示错误信息。

 

 

 

 

 源码的一些解释:

 

 

 

 

认证支持三种返回值:1、返回元祖,则request.user、request.auth被赋值,用自己的token和auth。

2、返回None,进入下一个自定义类的循环,但是都返回None时,默认赋值AnonymousUser(匿名用户,表示没登录)。

3、抛出异常,表示认证失败。

 

# 用户认证
class Authtication(object):
    def authenticate(self, request):
        token = request._request.GET.get('token')
        token_obj = models.UserToken.objects.filter(token=token).first()
        if not token_obj:  # token没给或者数据库查询不到,token提供错了
            raise exceptions.AuthenticationFailed('用户认证失败')  # 触发异常,AuthenticationFailed内部捕捉到这个错误
        # 在rest framework内部会整个两个字段赋值给request,以供后续操作使用
        return (token_obj.user, token_obj)  # 返回两个元组

    def authenticate_header(self, request):
        pass


class OrderView(APIView):
    ###订单相关业务###
    authentication_classes = [Authtication, ]  # 在类里应用上认证规则token

    # 先认证后才能查看订单的所有信息
    def get(self, request, *args, **kwargs):
        # request.user
        # request.auth
        # 验证是否登入成功,直接看返回的token,如果没有带token说明以前没有登入过
        # token = request._request.Get.get('token')
        # if not token:
        #     return HttpResponse('用户未登入')
        # self.dispatch()
        ret = {'code': 1000, 'msg': None, 'data': None}
        try:
            ret['data'] = ORDER_DICT
        except Exception as e:
            pass
        return JsonResponse(ret)


class UserInfoView(APIView):
    authentication_classes = [Authtication, ]  # 在类里应用上认证规则token,即应用类

    # 认证后才能查看用户信息
    def get(self, request, *args, **kwargs):
        return HttpResponse('用户信息')   #一般也要返回Jason数据,这里只是简便化的写法

认证可以加多个,但是一般不加多个。下面示例强行加多个认证:

# 用户认证
class FirstAuthtication(object):
    def authenticate(self, request):
        pass  # 返回None,交给下一个类处理,这里没有给request.user、request.auth
    def authenticate_header(self, request):
        pass


class Authtication(object):
    def authenticate(self, request):
        token = request._request.GET.get('token')
        token_obj = models.UserToken.objects.filter(token=token).first()
        if not token_obj:  # token没给或者数据库查询不到,token提供错了
            raise exceptions.AuthenticationFailed('用户认证失败')  # 触发异常,AuthenticationFailed内部捕捉到这个错误
        # 在rest framework内部会整个两个字段赋值给request,以供后续操作使用
        return (token_obj.user, token_obj)  # 返回两个元组

    def authenticate_header(self, request):
        pass


class OrderView(APIView):
    ###订单相关业务###
    authentication_classes = [FirstAuthtication, Authtication]  # 在类里应用上认证规则token

    # 先认证后才能查看订单的所有信息
    def get(self, request, *args, **kwargs):
        # request.user
        # request.auth
        # 验证是否登入成功,直接看返回的token,如果没有带token说明以前没有登入过
        # token = request._request.Get.get('token')
        # if not token:
        #     return HttpResponse('用户未登入')
        # self.dispatch()
        ret = {'code': 1000, 'msg': None, 'data': None}
        try:
            ret['data'] = ORDER_DICT
        except Exception as e:
            pass
        return JsonResponse(ret)


class UserInfoView(APIView):
    authentication_classes = [Authtication, ]  # 在类里应用上认证规则token,即应用类

    # 认证后才能查看用户信息
    def get(self, request, *args, **kwargs):
        return HttpResponse('用户信息')

 

posted @ 2022-06-01 15:11  费皿啊  阅读(70)  评论(0)    收藏  举报