You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django DRF是否提供只读Token机制?如何实现读写权限分离的Token认证?

DRF 实现只读/读写Token权限方案

DRF 内置的TokenAuthentication和默认Token模型没有区分只读、读写Token的功能,默认Token仅完成身份验证,不限制请求方法权限。

你的思路方向是对的,结合DRF的权限体系可以更优雅地实现需求,不用完全重写认证类,具体步骤如下:

1. 自定义Token模型,添加类型标识

扩展默认的Token模型,新增字段记录Token的权限类型:

# your_app/models.py
from django.db import models
from rest_framework.authtoken.models import Token

class PermissionToken(Token):
    class TokenType(models.TextChoices):
        READ_ONLY = "read_only", "只读"
        READ_WRITE = "read_write", "读写"

    token_type = models.CharField(
        max_length=20,
        choices=TokenType.choices,
        default=TokenType.READ_WRITE,
    )

在项目settings.py中指定自定义的Token模型:

AUTH_TOKEN_MODEL = "your_app.PermissionToken"

2. 自定义权限类,校验Token权限与请求方法

创建自定义权限类,根据当前请求的Token类型和请求方法判断是否允许访问:

# your_app/permissions.py
from rest_framework import permissions

class TokenPermission(permissions.BasePermission):
    def has_permission(self, request, view):
        # 确保用户已通过Token认证
        if not request.user or not request.user.is_authenticated:
            return False
        
        # 获取当前请求对应的Token实例
        token_key = request.auth.key
        token = request.user.permissiontoken_set.get(key=token_key)
        
        # 只读Token仅允许GET/HEAD/OPTIONS这类安全请求方法
        if token.token_type == token.TokenType.READ_ONLY and request.method not in permissions.SAFE_METHODS:
            return False
        
        return True

3. 配置视图或全局使用权限类

  • 单个视图中使用:
from rest_framework.views import APIView
from rest_framework.authentication import TokenAuthentication
from .permissions import TokenPermission

class YourAPIView(APIView):
    authentication_classes = [TokenAuthentication]
    permission_classes = [TokenPermission]
    
    # 视图逻辑...
  • 全局配置(在settings.py中):
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'your_app.permissions.TokenPermission',
    ],
}

补充:生成不同类型的Token

可以自定义视图或命令为用户生成指定类型的Token:

# 示例:生成只读Token
from your_app.models import PermissionToken

def create_read_only_token(user):
    token = PermissionToken.objects.create(user=user, token_type=PermissionToken.TokenType.READ_ONLY)
    return token.key

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:18:11