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
相关产品推荐
相关产品推荐

