Django REST Framework 内置认证类使用

本教程专注讲解DRF框架自带的核心认证类,通过源码解析和实战演示,帮助开发者快速掌握Session、Token、Basic等内置认证方案的使用方法。


认证类检查
凭证有效
凭证无效
无凭证
当前认证类
遍历认证类
返回user/auth
立即返回401错误
继续下一个认证类
客户端发起请求
视图处理
加载认证类列表
是否还有认证类?
认证是否成功?
返回200和数据

一、内置认证类一览

1.1 核心认证类清单

认证类适用场景凭证传递方式
SessionAuthentication网页端会话认证Cookie自动携带
TokenAuthenticationAPI客户端长期令牌认证Header: Token <key>
BasicAuthentication简单HTTP基础认证Header: Basic <base64>
RemoteUserAuthentication代理服务器用户认证Header: REMOTE_USER

1.2 认证类依赖关系

# 所有认证类的基类
class BaseAuthentication:
    def authenticate(self, request):  # 必须实现
        pass  
    
    def authenticate_header(self, request):  # 用于401响应
        pass

二、认证类配置与使用

2.1 全局配置(settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ]
}

2.2 视图级配置

from rest_framework import authentication, views

class UserDetailView(views.APIView):
    authentication_classes = [
        authentication.TokenAuthentication
    ]
    
    def get(self, request):
        return Response({'user': request.user.username})

三、核心认证类详解

3.1 Session认证(SessionAuthentication

  • 适用场景​​:Django Admin整合、前后端不分离项目
  • ​​实现原理​​:
    • 通过Django的sessionid Cookie验证用户
    • 自动关联到request.userrequest.session
  • ​​安全要求​​:
    • 必须启用 CSRF 中间件
    • 仅限HTTPS环境生产使用
  • ​​代码验证​​:
# 登录视图(Django原生)
from django.contrib.auth import login

def login_view(request):
    user = authenticate(username='admin', password='admin123')
    login(request, user)  # 设置session

3.2 Token认证(TokenAuthentication

  • 适用场景​​:移动端/桌面客户端API访问

  • ​​使用流程​​:

    1. 生成Token
    python manage.py drf_create_token admin  # 命令行生成
    # 代码生成(需关联用户)
    from rest_framework.authtoken.models import Token
    token = Token.objects.create(user=user)
    
    1. 客户端传Token
    GET /api/user/ HTTP/1.1
    Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b
    
  • 数据库模型​​

    # rest_framework/authtoken/models.py
    class Token(models.Model):
        key = models.CharField(max_length=40, primary_key=True)
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        created = models.DateTimeField(auto_now_add=True)
    

3.3 Basic认证(BasicAuthentication

  • ​​适用场景​​:内部系统快速集成、调试阶段
  • *​​工作原理**​​:
    • 客户端将username:password进行Base64编码
    • 通过Authorization头传递:Basic <credentials>
  • ​​示例请求​​:
    GET /api/books/ HTTP/1.1
    Authorization: Basic YWRtaW46YWRtaW4xMjM=
    ```​​
    
  • 安全警告​​
    • 必须配合HTTPS使用(明文传输密码)
    • 不适合生产环境开放接口

3.4 代理认证(RemoteUserAuthentication

  • ​​适用场景​​:Nginx/Apache等代理服务器已处理认证
  • ​​配置示例​​:
    # settings.py
    AUTHENTICATION_BACKENDS = [
        'django.contrib.auth.backends.RemoteUserBackend',
    ]
    
    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': [
            'rest_framework.authentication.RemoteUserAuthentication',
        ]
    }
    
  • ​​请求要求​​:
    • 代理服务器需设置头信息:
    • X-Forwarded-User: admin

四、认证流程源码解析

4.1 认证执行入口

# rest_framework/views.py
class APIView:
    def initial(self, request, *args, **kwargs):
        self.perform_authentication(request)  # 认证入口

    def perform_authentication(self, request):
        request.user  # 访问时触发认证

4.2 认证过程分解

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

            if user_auth is not None:
                self.user, self.auth = user_auth  # 赋值关键属性
                return
        self._not_authenticated()

4.3 认证结果处理

  • ​认证成功​​:填充request.userrequest.auth
  • ​​认证失败​​:抛出AuthenticationFailed异常
  • ​​跳过认证​​:返回None(继续下一个认证类)

五、多认证方案共存策略

5.1 认证优先级控制

# 先验证Token,失败后尝试Session
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ]
}

5.2 混合认证示例

class HybridAuthView(APIView):
    authentication_classes = [
        authentication.TokenAuthentication,
        authentication.SessionAuthentication,
    ]
    
    def get(self, request):
        if request.auth:  # Token认证结果
            return Response({'type': 'token'})
        elif request.user.is_authenticated:  # Session认证
            return Response({'type': 'session'})

六、生产环境注意事项

6.1 安全增强建议

​​

  1. Session认证​​:
    • 设置SESSION_COOKIE_SECURE = True
    • 配置CSRF_COOKIE_HTTPONLY
  2. ​​Token认证​​
    • 定期轮换Token密钥
    • 监控异常Token使用
  3. ​​Basic认证​​:
    • 仅限内部网络使用
    • 限制失败尝试次数

6.2 性能优化

  • ​​Token存储​​:使用Redis替代数据库
    # settings.py
    REST_FRAMEWORK = {
        'DEFAULT_AUTH_TOKEN_MODEL': 'redis_tokens.models.RedisToken',
    }
    
  • Session后端​​:使用缓存加速

七、调试与问题排查

7.1 常见错误场景

现象原因分析解决方案
401 Unauthorized未提供有效凭证检查Authorization头格式
403 ForbiddenSession认证未通过CSRF检查添加CSRF Token或禁用CSRF
Token失效用户被删除或Token被重置重新生成Token

7.2 调试技巧

# 打印当前认证信息
print(request.authenticators)  # 查看生效的认证类
print(request.user)             # 认证后的用户对象
print(request.auth)             # 附加认证数据(如Token实例)

通过本教程,您已掌握DRF内置认证机制的核心用法,可根据项目需求灵活选择认证方案。下一步可深入学习JWT等第三方认证扩展方案!🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Yant224

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

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

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

打赏作者

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

抵扣说明:

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

余额充值