sách gpt4 ăn đã đi

DRF的认证组件(源码分析)

In lại Tác giả: Tôi là chú chim nhỏ 更新时间:2023-04-21 14:31:45 35 4
mua khóa gpt4 giày nike

DRF认证组件(源码分析)

1. 数据库建立用户表

在drf中也给我们提供了 认证组件 ,帮助我们快速实现认证相关的功能,例如:

              
                # models.py 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)

              
            

2. 自定义认证类

定义一个认证的类并继承BaseAuthentication 。

              
                # -*- encoding:utf-8 -*- # @time: 2023/4/21 8:44 # @author: ifeng from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions import AuthenticationFailed from app01 import models # 用户认证 class TokenAuthentication(BaseAuthentication): def authenticate(self, request): token = request.query_params.get('token') if not token: raise AuthenticationFailed({'code': 1002, 'error': '认证失败'}) user_obj = models.UserInfo.objects.filter(token=token).first() if not user_obj: raise AuthenticationFailed({'code': 1001, 'error': '认证失败'}) return user_obj, token def authenticate_header(self, request): return 'Bearer realm="API"'

              
            

3. 视图函数中添加认证

              
                from rest_framework.response import Response from rest_framework.views import APIView from .auth import TokenAuthentication # 导入认证类 from app01 import models # Create your views here. class UserView(APIView): authentication_classes = [TokenAuthentication, ] # token认证 def get(self, request, *args, **kwargs): # 用户认证 print(request.user, request.auth) return Response({'code': 0, 'data': '嘻嘻嘻哈啊哈哈'}) def post(self, request, *args, **kwargs): pass

              
            

4. 关于返回None

接下来说说 “返回None” 是咋回事.

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

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

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

                
                  REST_FRAMEWORK = { "UNAUTHENTICATED_USER": lambda: None, "UNAUTHENTICATED_TOKEN": lambda: None, }

                
              

应用场景

当某个API,已认证 和 未认证 的用户都可以访问时,比如:

  • 已认证用户,访问API返回该用户的视频播放记录列表。
  • 未认证用户,访问API返回最新的的视频列表。

注意:不同于之前的案例,之前案例是:必须认证成功后才能访问,而此案例则是已认证和未认证均可访问.

5. 关于返回多个认证类

当项目中可能存在多种认证方式时,就可以写多个认证类。例如,项目认证支持:

  • 在请求中传递token进行验证。
  • 请求携带cookie进行验证。
              
                class UserView(APIView): authentication_classes = [TokenAuthentication, CookieAuthentication] # token认证

              
            

6. 全局配置

在每个视图类的类变量 authentication_classes 中可以定义,其实在配置文件中也可以进行全局配置,例如:

              
                REST_FRAMEWORK = { # 认证 "UNAUTHENTICATED_USER": lambda: None, # 如果每一个认证最后都返回None. 就会调用到这个 "UNAUTHENTICATED_TOKEN": lambda: None, 'DEFAULT_AUTHENTICATION_CLASSES': ['app01.auth.TokenAuthentication', ] }

              
            

7. 源码分析

序号为执行流程 。

最后此篇关于DRF的认证组件(源码分析)的文章就讲到这里了,如果你想了解更多关于DRF的认证组件(源码分析)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

35 4 0
tôi là một con chim nhỏ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress