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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:33:00