DRF 认证

Django REST Framework认证机制详解

Django REST Framework 提供了强大且灵活的认证系统,允许您轻松地保护 API 端点。

认证流程
请求到达 → 认证检查 → 权限检查 → 限流检查 → 视图处理

1、BaseAuthentication

认证基类

/* by 01130.hk - online tools website : 01130.hk/zh/json2excel.html */

class BaseAuthentication:
    """
    所有身份验证类都应该扩展BaseAuthentication。
    """

    def authenticate(self, request):
        """
        子类必须覆盖该方法, 认证成功后,request.user 和 request.auth 属性会被设置,如果认证失败,可能抛出异常或返回 None
        """
        raise NotImplementedError(".authenticate() must be overridden.")

    def authenticate_header(self, request):
        """
        """
        pass

2、JSON Web Token (JWT) 认证

基于 JWT 的认证,适合现代无状态 API。

安装

/* by 01130.hk - online tools website : 01130.hk/zh/json2excel.html */
pip install djangorestframework-simplejwt

全局配置


# settings.py
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
}

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
    'ROTATE_REFRESH_TOKENS': False,
    'BLACKLIST_AFTER_ROTATION': True,
}

URL 配置


# urls.py
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
    TokenVerifyView,
)

urlpatterns = [
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    path('api/token/verify/', TokenVerifyView.as_view(), name='token_verify'),
]

源码


class JWTAuthentication(authentication.BaseAuthentication):

    def authenticate(self, request: Request) -> Optional[tuple[AuthUser, Token]]:
        """
        从请求头提取 Token → 验证 Token → 获取用户
        """

    def authenticate_header(self, request: Request) -> str:
        return '{} realm="{}"'.format(
            AUTH_HEADER_TYPES[0],
            self.www_authenticate_realm,
        )

    def get_header(self, request: Request) -> bytes:
        """	
        从 Authorization请求头获取 JWT 字符串, 默认查找 Authorization: Bearer <token>
        """


    def get_raw_token(self, header: bytes) -> Optional[bytes]:
        """
        从头部字符串中提取纯粹的 Token 内容
        """
        

    def get_validated_token(self, raw_token: bytes) -> Token:
        """
        验证 Token 签名、检查过期时间、确认结构完整性, 依赖 api_settings.JWT_PAYLOADVALIDATOR, 无效时抛出 InvalidToken异常
        """
        

    def get_user(self, validated_token: Token) -> AuthUser:
        """
        从验证后的 Token 载荷 (Payload) 中提取用户标识 (如 user_id),并查询数据库获取用户对象, 依赖 api_settings.USER_ID_FIELD, 用户不存在时抛出 AuthenticationFailed异常
        """

3、使用

settings.py

配置会将 JWTAuthentication应用于所有 DRF 视图

局部启用/禁用

视图级认证配置


# 局部启用
from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework.views import APIView

class ExampleView(APIView):
    authentication_classes = [JWTAuthentication]
    # ...

# 局部禁用(设为空列表)
class PublicView(APIView):
    authentication_classes = []
    # ...

基于函数的视图配置
使用 @api_view 装饰器


from rest_framework.decorators import api_view, authentication_classes,

@api_view(['GET'])
@authentication_classes([TokenAuthentication])
def example_view(request):
    return Response({"message": "Authenticated successfully"})

4. 自定义认证类

创建自定义认证类需要继承 BaseAuthentication 并实现 authenticate 方法


# authentication.py
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from django.contrib.auth.models import User
from django.conf import settings

class APIKeyAuthentication(BaseAuthentication):
    """
    自定义API密钥认证
    """
    
    def authenticate(self, request):
        # 从请求头获取API密钥
        api_key = request.META.get('HTTP_X_API_KEY')
        
        if not api_key:
            return None  # 没有提供认证信息
        
        # 验证API密钥
        if api_key != settings.API_KEY:
            raise AuthenticationFailed('Invalid API key')
        
        # 返回用户对象和认证凭证
        # 这里可以返回一个特定用户或匿名用户
        user, created = User.objects.get_or_create(
            username='api_client',
            defaults={'is_active': True}
        )
        
        return (user, {'api_key': api_key})
    
    def authenticate_header(self, request):
        """
        返回WWW-Authenticate头的值
        """
        return 'APIKey'

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值