首页 > 其他分享 >5.drf-认证

5.drf-认证

时间:2023-02-16 22:45:53浏览次数:35  
标签:authenticate 验证 request 认证 token user drf

在开发后端API的时候,不同的功能可能有不同的限制,如

  • 无需验证:API可以直接访问

  • 需要验证:API只有用户通过验证才可以访问

这个时候我们就可以使用DRF提供的认证组件,下面通过一个例子介绍

我们希望用户在登录之后,才能访问订单页面

模型类

from django.db import models

class UserInfo(models.Model):
    username = models.CharField(verbose_name="用户名", max_length=32)
    password = models.CharField(verbose_name="密码", max_length=64)
    token = models.CharField(verbose_name="TOKEN", max_length=64, null=True, blank=True)

用户登录类

复制代码
"""
根据前端传递过来的用户名和密码,生成对应的token,返回给前端
"""
class AuthView(APIView):
    """
    用户登录验证
    """

    def post(self, request, *args, **kwargs):
        username = request.data.get('username')
        password = request.data.get('password')
        user_object = UserInfo.objects.filter(username=username, password=password).first()
        if not user_object:
            return Response(
                {
                    'code': 1000,
                    'data': '用户名或者密码错误'
                }
            )
        token = str(uuid.uuid4())
        user_object.token = token
        user_object.save()
        return Response({
            'code': 0,
            'data': {'token': token, 'name': username}
        })
复制代码

认证类

复制代码
from rest_framework.response import Response
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed

class MyAuthentication(BaseAuthentication):
    def authenticate(self, request):
        token = request.query_params.get('token')
        if not token:
            raise AuthenticationFailed({
                'code': 1000,
                'data': '验证失败',
            })
        user_object = UserInfo.objects.filter(token=token).first()
        if not user_object:
            raise AuthenticationFailed({
                'code': 1000,
                'data': '验证失败',
            })
        return user_object, token

    def authenticate_header(self, request):
        return 'Bearer realm="API"'
复制代码
  1. 在认证类中将验证功能定义在authenticate函数中

  2. authenticate_header函数将返回值设置给响应头 WWW-Authenticate

  3. 对于验证失败,抛出AuthenticationFailed异常

  4. 验证成功,则返回一个元组,第一个元素为当前登录用户对象,第二个为验证token,封装在request中

    1. request.user

    2. Request.auth

  5. 跳过验证,返回None

订单视图类

复制代码
class OrderView(APIView):
    authentication_classes = [MyAuthentication, ]

    def get(self, request, *args, **kwargs):
        print(request.user)
        print(request.auth)
        return Response({
            'code': 0,
            'data': '订单数据'
        })
复制代码 复制代码
在视图类中设置类变量 authentication_classes的值为 认证类 MyAuthentication,表示此视图在执行内部功能之前需要先经过 认证。

认证类是可以使用多个的,从上面中列表就可以知道,一般情况下一个认证类就够了。但有时候我们需要支持多种验证方式

    在请求中使用token

    进行cookie验证

    ...
复制代码

 

 

 

关于返回None

  • 在视图类的 authentication_classes 中定义认证类时,传入的是一个列表,支持定义多个认证类。

  • 当出现多个认证类时,drf内部会按照列表的顺序,逐一执行认证类的 authenticate 方法,如果 返回元组 或 抛出异常 则会终止后续认证类的执行;如果返回None,则意味着继续执行后续的认证类。

  • 如果所有的认证类authenticate都返回了None,则默认 request.user="AnonymousUser" 和 request.auth=None,也可以通过修改配置文件来修改默认值

全局配置

REST_FRAMEWORK = {
    "UNAUTHENTICATED_USER": lambda: None,
    "UNAUTHENTICATED_TOKEN": lambda: None,
    "DEFAULT_AUTHENTICATION_CLASSES":["xxxx.xxxx.xx.类名","xxxx.xxxx.xx.类名",]
}

底层源码实现

 

 

关于authenticate返回值小结

  • 抛出异常,则终止验证,返回可前端错误数据

  • 返回None,跳过该验证类,执行下一个验证类的authenticate

  • 返回一个元组,一个用户,一个验证,终止验证,执行对应的视图函数

标签:authenticate,验证,request,认证,token,user,drf
From: https://www.cnblogs.com/MRPython/p/17128574.html

相关文章

  • 4.drf-版本管理
    根据RESTful规范,后端API中需要体现出版本,DRF中支持5种版本的设置,常见的三种如下1.URL的GET中传递参数在视图类中定义fromrest_framework.versioningimportQuery......
  • 8.drf-序列化器
    在序列化类中,如果想使用request,则可以通过self.context['request']获取序列化器的主要由两大功能-对请求的数据进行校验(底层调用的是Django的Form和ModelForm)-对数......
  • 7.drf-限流
    限流就是限制用户的访问频率,如每分钟的操作的次数不超过3次等对于匿名用户,使用用户IP作为唯一标识对于登录用户,则使用用户的ID作为唯一标识1.限流的机制DRF中......
  • 6.drf-权限
    认证:判断用户是否登陆,从而获取用户的信息权限:判断当前用户是否有权限访问API接口,例如:普通用户,管理员,超级管理员权限可能是不同的下面通过案例进行介绍模型类fromdj......
  • drf回顾,前端发展历史,vue介绍,第一个helloword,插值语法
    目录drf回顾,前端发展历史,vue介绍,第一个helloword,插值语法今日内容概要今日内容详细1drf回顾2前端发展历史3vue介绍4第一个helloworld5插值语法drf回顾,前端发展历史,vu......
  • 申报发布的项目是用SpringSecurity-OAuth2模式登录认证的
    SpringSecurity-OAuth2万文详解https://blog.csdn.net/weixin_68320784/article/details/124103484清晰搞懂SpringSecurity的登录认证https://blog.csdn.net/Aqting/ar......
  • 聊一聊HTTPS双向认证的简单应用
    目录背景准备工作ASP.NETCorenginx反向代理IIS部署总结参考资料背景在三方接口对接中,偶尔会遇到需要传递证书的情况,这种方式其实是在SSL握手过程中会同时验证客户端和......
  • Github学生认证具体步骤
    具体步骤展示一、进入相关的申请地址地址在此:https://education.github.com/pack/二、选中右上方的Student,然后选择第二个选项在我们已经注册号Github账户的情况下,会......
  • WHQL认证多少钱?微软WHQL认证流程
    WHQL认证多少钱是很多驱动程序开发者关心的。虽然WHQL认证微软不收取费用,但是认证过程中,需要搭建多种类型的系统环境完成兼容性测试,需要按微软要求完成微软WHQL认证流程,这对......
  • jwt配置文件 drf-jwt源码执行流程 自定义用户实现jwt的签发和认证 simpleui 权限控制(
    昨日内容回顾#1接口文档的编写-1word,md编写---->存放位置:存放共享文件平台,git上-2第三方的接口文档编写平台-3公司自己开发,使用开源搭建yapi......