zoukankan      html  css  js  c++  java
  • 【DRF认证】

    本文详细讲述了DRF认证组件的原理以及用法.

    @


    源码剖析

    上一篇博客讲解DRF版本的时候我们都知道了,在dispatch方法里执行了initial方法来初始化我们的版本.

    而在initial方法里有我们的认证、权限、频率组件,如下图:
    在这里插入图片描述
    我们再点进去认证组件看看:
    在这里插入图片描述
    可以看到,我们的权限组件返回的是request.user,那么这里返回的request是新的还是旧的呢?

    initial方法是在request重新赋值之后执行的,所以我们这里的request是新的——也就是Request类的实例化对象.

    所以,这个user一定是一个静态方法,我们进去看看:
    在这里插入图片描述
    在这里插入图片描述
    我没在这里反复的截图跳转页面,大家可以尝试着自己去找.

    通过上面的分析,我们基本可以知道我们的认证类一定要实现的方法、返回值的类型,以及视图中要配置的参数:authentication_classes = ["认证组件类", ]

    如果需要全局验证,则在配置文件中加上此配置:

    REST_FRAMEWORK = {
        # 配置全局认证
        'DEFAULT_AUTHENTICATION_CLASSES': ["blog.auth.MyAuth", ],
    }
    

    认证组件的详细用法

    第一步 准备数据库文件和数据
    ·

    # models.py
    from django.db import models
    
    class UserInfo(models.Model):
        name = models.CharField(max_length=32)
        pwd = models.CharField(max_length=32)
        token = models.UUIDField(null=True, blank=True)
    

    数据如下:

    mysql> select * from blog_userinfo;
    +----+-----------+-----------+-------+
    | id | name      | pwd       | token |
    +----+-----------+-----------+-------+
    |  1 | 花千骨    | huaqiangu |       |
    +----+-----------+-----------+-------+
    1 row in set (0.00 sec)
    

    第二步 自定义一个认证类

    from rest_framework.authentication import BaseAuthentication  # > 导入认证类
    from rest_framework.exceptions import AuthenticationFailed  # 用于抛出错误信息
    from .models import UserInfo  # 导入用户信息表
    
    
    class MyAuth(BaseAuthentication):
        def authenticate(self, request):
            """自定义的认证类中必须有此方法以及如下的判断和两个返回值"""
    
            # 1. 获取token
            token = request.query_params.get('token')
    
            # 2. 判断是否成功获取token
            if not token:
                raise AuthenticationFailed("缺少token")
    
            # 3. 判断token是否合法
            try:
                user_obj = UserInfo.objects.filter(token=token).first()
            except Exception:
                raise AuthenticationFailed("token不合法")
    
            # 4. 判断token在数据库中是否存在
            if not user_obj:
                raise AuthenticationFailed("token不存在")
    
            # 5. 认证通过
            return (user_obj.name, user_obj)
            # 注意,权限组件会用到这两个返回值
    

    第三步 urls.py

    from django.conf.urls import url
    from blog.views import LoginView, TestAuthView
    
    urlpatterns = [
        url(r'^login/$', LoginView.as_view()),  # 用于登陆
        url(r'^test/$', TestAuthView.as_view()),  # 用于认证测试
    ]
    

    第四步 views.py

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from .auth import MyAuth  # 导入自定义的认证组件
    from .models import UserInfo  # 导入用户信息表
    import uuid  # 用于生成uuid
    
    
    class LoginView(APIView):
        """用于登陆验证并生成UUID的视图"""
    
        def post(self, request):
            name = request.data.get('name')
            pwd = request.data.get('pwd')
            user_obj = UserInfo.objects.filter(name=name, pwd=pwd).first()
            if user_obj:
                u4 = uuid.uuid4()  # 生成uuid4
                user_obj.token = u4
                user_obj.save()
                return Response(u4)
            return Response("用户名或密码错误")
    
    
    class TestAuthView(APIView):
        """用于认证测试的视图"""
        
        # 在视图中增加此配置,即表明此视图要走认证逻辑认证
        # 认证组件可以写多个
        authentication_classes = [MyAuth, ]
    
        def get(self, request):
            return Response("认证测试")
    

    好了,我们来测试吧.

    首先,登陆并生成UUID:
    在这里插入图片描述
    成功提交数据后,将生成并返回UUID:
    在这里插入图片描述
    然后,复制UUID,去测试认证:
    在这里插入图片描述
    如果我们不指定token:
    在这里插入图片描述
    或者指定错误的、不存在的token,都将被抛出错误.

    is ok.

  • 相关阅读:
    ant 软件包不存在报错
    在 Internet Explorer 中使用 Windows 窗体控件
    智能客户端
    Back to the Future with Smart Clients
    "Automation 服务器不能创建对象" 的解决方案
    Top 10 Reasons for Developers to Create Smart Clients
    Updater Application Block for .NET
    Smart Client Application Model and the .NET Framework 1.1
    Security and Versioning Models in the Windows Forms Engine Help You Create and Deploy Smart Clients
    智能客户端技术总结(二)
  • 原文地址:https://www.cnblogs.com/zyk01/p/10176379.html
Copyright © 2011-2022 走看看