Django JWT场景下如何实现携带有效UUID即可免身份凭证访问接口
实现方案
这种选择性校验逻辑完全可以在DRF框架下实现,你可以分Serializer层、视图权限层两步处理即可:
步骤1:Serializer层实现UUID字段校验
先在序列化器中自定义字段校验规则,自动完成UUID格式、存在性的校验:
from rest_framework import serializers from .models import YourUUIDModel # 替换为你存储UUID的实际模型 import uuid class YourBusinessSerializer(serializers.Serializer): # 其余业务字段省略 target_uuid = serializers.UUIDField(required=False, allow_null=True) def validate_target_uuid(self, value): if value is None: return value # 自带UUIDField已经先校验了格式合法性,这里只需要校验数据库存在性 if not YourUUIDModel.objects.filter(uuid=value).exists(): raise serializers.ValidationError("传入的UUID未在系统中注册") return value
步骤2:自定义权限类实现动态身份校验
重写DRF权限类,根据请求是否携带UUID字段动态判断是否需要校验Access Token:
from rest_framework.permissions import BasePermission from rest_framework.exceptions import AuthenticationFailed class SelectiveAuthPermission(BasePermission): def has_permission(self, request, view): # 适配不同请求方法的参数获取 request_data = request.data if request.method in ("POST", "PUT", "PATCH") else request.query_params # 携带了UUID字段的情况,直接放行,UUID合法性交给Serializer校验 if "target_uuid" in request_data: return True # 未携带UUID的情况,强制校验AccessToken身份 if not request.user or not request.user.is_authenticated: raise AuthenticationFailed("未携带UUID时必须传入有效的Access Token") return True
步骤3:视图层引入配置
在业务视图中保留原有的AccessToken认证类,添加上面写的自定义权限类即可:
from rest_framework.views import APIView from rest_framework.authentication import TokenAuthentication # 替换为你实际用的AccessToken认证类 from .permissions import SelectiveAuthPermission from .serializers import YourBusinessSerializer class YourBusinessApiView(APIView): authentication_classes = [TokenAuthentication] permission_classes = [SelectiveAuthPermission] def post(self, request): serializer = YourBusinessSerializer(data=request.data) serializer.is_valid(raise_exception=True) # 后续业务逻辑 return Response({"status": "success"})
注意事项
- 如果需要兼容空字符串形式的UUID传值,可以在权限类中增加值非空判断,空值按未携带UUID处理
- 如果你用的是GenericView、ViewSet等其他视图类型,直接替换permission_classes配置即可,逻辑通用
内容的提问来源于stack exchange,提问作者andrepz
相关产品推荐
相关产品推荐

