一、DRF 认证机制的本质
DRF 认证机制是一套 身份核验系统,其核心目的是:
验证 HTTP 请求的发起者身份,将请求关联到合法用户实体(User),为后续权限控制和数据操作提供身份依据。
二、认证 VS 权限:核心区别
维度 | 认证(Authentication) | 权限(Permissions) |
---|---|---|
核心问题 | 你是谁? | 你能做什么? |
执行顺序 | 优先执行(身份核验) | 在认证之后执行(权限核验) |
输出结果 | request.user / request.auth | True (允许)或 False (拒绝) |
技术实现 | Token、Session、BasicAuth | IsAuthenticated 、IsAdminUser |
三、核心要素
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
可立即中断请求
五、设计哲学
- 可扩展性原则
- 自定义认证类:继承
BaseAuthentication
实现任意逻辑
class CustomAuth(BaseAuthentication): def authenticate(self, request): api_key = request.META.get('X-API-KEY') # 自定义验证逻辑...
- 混合认证策略:支持多认证方案共存(如 Session + Token)
- 自定义认证类:继承
- 无状态性(
Stateless
)- 服务端不保存会话状态(Session 认证除外)
- 每次请求必须携带完整凭证
- 安全分层策略
层级 | 实现方式 | 示例场景 |
---|---|---|
传输安全 | HTTPS 加密 | 所有生产环境 API |
凭证安全 | Token 轮换、JWT 短有效期 | 高敏感操作 API |
认证强度 | 多因素认证(MFA) | 支付、账户修改等关键API |
- 与 Django 生态整合
- 复用
Django
用户系统(django.contrib.auth.models.User
) - 兼容
Django
中间件(如SessionMiddleware
、CsrfViewMiddleware
)
- 复用
六、典型应用场景
-
内部管理系统
- 认证方案:Session 认证
- 配置示例:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', ], 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAdminUser' ] }
-
移动端 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') ```
- 认证方案:
-
第三方服务
- 认证方案:HMAC 签名认证
- 实现要点:
class HMACAuthentication(BaseAuthentication): def authenticate(self, request): signature = request.META.get('X-Signature') data = request.body # 验证签名有效性... return (service_account, None)
七、概念总结
DRF 认证机制本质上是一个 身份网关,其通过模块化、分层式的设计实现了:
- 身份可信:确保请求来源可追溯
- 灵活扩展:适配不同安全级别的业务需求
- 安全隔离:将身份验证与业务逻辑解耦
理解这一机制是构建安全、可维护的 REST API 的基石。🔐