zoukankan      html  css  js  c++  java
  • DRF框架之认证组件用法(第四天)

    1. 什么是drf 框架的认证组件: auth 就等于是jango中的Auth模块,Auth是自带session信息,但是 drf的认证组件可以自定义token携带过去,去判断用的

    2.如何实现认证呢?

    from rest_framework.authentication import BaseAuthentication
    from app01 import models
    from rest_framework.exceptions import AuthenticationFailed
    class MyAuthetication(BaseAuthentication):
        #重写这个方法
        def authenticate(self,request):
            #认证相关的东西
    
            #如果token信息放到请求头中,如何取?
            # request._request.META
            # token=request.META.get('token')
    
            # 校验该次请求是否携带正确的token
            #取出token
            token=request.GET.get('token')
            #校验该次请求是否携带正确的token
            ret=models.UserToken.objects.filter(token=token).first()
            if ret:
                #正常通过认证的用户
                #ret.user 当前登录用户
                return ret.user,token
                # return None
            else:
                #没有登录或者非法用户
                raise AuthenticationFailed('您没有通过认证')
    判断用户登录携带的token是否正确

    3. 如何在登录的时候加载认证信息处理是否是正常的用户

    #写登录接口
    class Login(APIView):
        #全局使用的局部禁用
        authentication_classes = []
        def post(self,request):
            response={'status':100,'msg':None}
            name=request.data.get('name')
            pwd=request.data.get('pwd')
            #去数据库校验该用户是否存在
            user=models.User.objects.filter(name=name,pwd=pwd).first()
            if user:
                #正常用户登录成功
                #返回一个唯一的随机字符串
                token=uuid.uuid4()
                #把生成的随机字符串存到数据库中
                # 这样不行,因为每次登录都会新插入一条
                # models.UserToken.objects.create(user=user,token=token)
                # 先去数据库中查询,如果当前用户存在记录,更新token,如果不存在,新增一条
                # 根据user取查询,如果查到数据,更新defaults中的数据,如果查不到,新增一条数据
                ret=models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
                response['msg']='登录成功'
                response['token']=token
            else:
                #用户名或密码错误
                response['status'] = 101
                response['msg'] = '用户名或密码错误'
            return Response(response)
    简单的登录加载认证处理

    4. 如何全局使用呢?

    # 认证的全局配置
    REST_FRAMEWORK={
        'DEFAULT_AUTHENTICATION_CLASSES':['app01.MyAuth.MyAuthetication',],
    
    }

    5. 如何全局禁用,局部使用呢?

    #写登录接口
    class Login(APIView):
        #全局使用的局部禁用
        authentication_classes = [MyAuthetication]
        def post(self,request):
  • 相关阅读:
    楼宇及工业自动化总线协议介绍
    PROFIBUS,PROFINET,Ethernet三者的区别
    转:OSAL多任务资源分配机制
    Zigbee系列 学习笔记二(工程文件分析)
    Zigbee系列 学习笔记一(协议栈)
    STC12C5A60S2单片机 PWM调试
    单片机 IO口配置模式介绍
    串口通信校验方式
    STC12C5A60S2单片机 串口调试
    本地Nexus 3.3.2 启动
  • 原文地址:https://www.cnblogs.com/gukai/p/10780606.html
Copyright © 2011-2022 走看看