DRF 认证机制的基础概念

一、DRF 认证机制的本质

DRF 认证机制是一套 身份核验系统,其核心目的是:
验证 HTTP 请求的发起者身份,将请求关联到合法用户实体(User),为后续权限控制和数据操作提供身份依据。


二、认证 VS 权限:核心区别

维度认证(Authentication)权限(Permissions)
核心问题你是谁?你能做什么?
执行顺序优先执行(身份核验)在认证之后执行(权限核验)
输出结果request.user / request.authTrue(允许)或 False(拒绝)
技术实现Token、Session、BasicAuthIsAuthenticatedIsAdminUser

三、核心要素

1. 认证类(Authentication Classes)

  • 角色:身份验证规则的载体

  • 职责

    • 从请求中提取凭证(Token、Session ID 等)
    • 验证凭证有效性(如检查 Token 是否过期)
    • 返回用户对象(request.user)和认证附加信息(request.auth
  • 特点

    • 通过 authentication_classes 可插拔配置
    • 支持多认证方案共存(如 Token + Session)
  • 核心方法

    class BaseAuthentication:
        def authenticate(self, request):  # 必须实现 → 返回(user, auth)或None
            raise NotImplementedError
        
        def authenticate_header(self, request):  # 定义401响应头
            pass
    
  • ​​配置方式​​

    # 视图级配置
    class UserAPI(APIView):
        authentication_classes = [TokenAuthentication]
    
    # 全局配置(settings.py)
    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': [
            'rest_framework.authentication.SessionAuthentication',
            'rest_framework.authentication.TokenAuthentication',
        ]
    }
    

2. 凭证(Credentials)

  • 形式:Token、Session ID、用户名/密码、签名等
  • 传输方式
    • HTTP Headers(推荐)
    • Cookies(Session 认证)
    • URL 参数(不推荐,安全性低)
     # Token 示例
     Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b
     
     # Basic 认证
     Authorization: Basic YWRtaW46YWRtaW4xMjM=
    

3. 用户上下文(User Context)

  • 注入对象​​:
    • request.user → 认证用户或 AnonymousUser
    • request.auth → 认证附加数据(如 Token 对象)
  • ​​生命周期*​​:认证成功后注入 request.user,贯穿整个请求处理流程

四、工作流程

1. 认证流程

在这里插入图片描述

2. 核心源码解析

# rest_framework/request.py → Request._authenticate()
def _authenticate(self):
    for authenticator in self.authenticators:
        try:
            # 调用认证类的authenticate()方法
            user_auth_tuple = authenticator.authenticate(self)
        except exceptions.APIException:
            self._not_authenticated()
            raise

        if user_auth_tuple is not None:
            self._authenticator = authenticator
            self.user, self.auth = user_auth_tuple
            return
    self._not_authenticated()

3. 关键设计特点

  • ​​短路原则​​:首个认证成功的类终止后续流程
  • ​​匿名处理​​:所有认证失败时关联 AnonymousUser
  • ​​异常驱动​​:抛出 AuthenticationFailed 可立即中断请求

五、设计哲学

  1. 可扩展性原则
    • ​​自定义认证类​​:继承 BaseAuthentication 实现任意逻辑
    class CustomAuth(BaseAuthentication):
    	def authenticate(self, request):
        	api_key = request.META.get('X-API-KEY')
        	# 自定义验证逻辑...
    
    • ​​混合认证策略​​:支持多认证方案共存(如 Session + Token)
  2. 无状态性(Stateless
    • 服务端不保存会话状态(Session 认证除外)
    • 每次请求必须携带完整凭证
  3. 安全分层策略
层级实现方式示例场景
传输安全HTTPS 加密所有生产环境 API
凭证安全Token 轮换、JWT 短有效期高敏感操作 API
认证强度多因素认证(MFA)支付、账户修改等关键API
  1. 与 Django 生态整合
    • 复用 Django 用户系统(django.contrib.auth.models.User
    • 兼容 Django 中间件(如 SessionMiddlewareCsrfViewMiddleware

六、典型应用场景

  1. ​​内部管理系统​​

    • 认证方案​​:Session 认证
    • ​​配置示例​​:
    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': [
            'rest_framework.authentication.SessionAuthentication',
        ],
        'DEFAULT_PERMISSION_CLASSES': [
            'rest_framework.permissions.IsAdminUser'
        ]
    }
    
    
  2. ​​移动端 API​​

    • 认证方案​​:Token 认证
    • ​​优化实践​​:
    # 使用 Redis 存储 Token
    from rest_framework.authtoken.models import Token
    class RedisToken(Token):
        class Meta:
            abstract = True
        @classmethod
        def get(cls, user):
            return redis.get(f'user:{user.id}:token')
        ```
    
    
    
  3. ​​第三方服务​​

    • 认证方案​​:HMAC 签名认证
    • ​​实现要点​​:
    class HMACAuthentication(BaseAuthentication):
        def authenticate(self, request):
            signature = request.META.get('X-Signature')
            data = request.body
            # 验证签名有效性...
            return (service_account, None)
    

七、概念总结

DRF 认证机制本质上是一个 ​​身份网关​​,其通过模块化、分层式的设计实现了:

  • ​​身份可信​​:确保请求来源可追溯
  • ​​灵活扩展​​:适配不同安全级别的业务需求
  • ​​安全隔离​​:将身份验证与业务逻辑解耦

理解这一机制是构建安全、可维护的 REST API 的基石。🔐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yant224

点滴鼓励,汇成前行星光🌟

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值