• 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):
  • 相关阅读:
    Python os模块
    Python 常用模块
    CentOS7中配置基于Nginx+Supervisor+Gunicorn的Flask项目
    CentOS下安装Python3.4
    修改windows文件的换行符
    dubbo源码阅读-ProxyFactory(十一)之JdkProxyFactory
    dubbo源码阅读-Filter默认实现(十一)之DeprecatedFilter
    dubbo源码阅读-Filter默认实现(十一)之TimeoutFilter
    dubbo源码阅读-Filter默认实现(十一)之ExceptionFilter
    dubbo源码阅读-Filter默认实现(十一)之ContextFilter&ConsumerContextFilter
  • 原文地址:https://www.cnblogs.com/gukai/p/10780606.html
Copyright © 2020-2023  润新知