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

Django Rest Framework配置AllowAny后仍提示未提供身份验证凭据如何解决

问题排查与解决方案

核心原因1:路由匹配顺序冲突

Django路由会从上到下优先匹配第一个符合规则的条目,你的配置中存在同一路径多视图规则匹配的隐患:

urlpatterns = [
    path("", UserViewSet.as_view({"post": "create"}), kwargs={'quantity': 1}),
    path("<int:quantity>/", UserViewSet.as_view({"post": "create"})),
    path("", GetUserViewSet.as_view({"get": "list"})),
    path("<int:pk>/", GetUserViewSet.as_view({"get": "retrieve"})),
    path("<int:pk>/", UserViewSet.as_view({"put": "update", "delete": "destroy"})),
]

如果你的UserViewSet配置了默认认证权限IsAuthenticated,且存在未明确声明的GET类action,会导致部分GET请求优先匹配到UserViewSet的规则,触发权限拦截。

  • 修复方案:给公开查询接口单独加路由前缀和其他接口完全隔离,避免路径冲突,例如:
path("public/users/", GetUserViewSet.as_view({"get": "list"})),
path("public/users/<int:pk>/", GetUserViewSet.as_view({"get": "retrieve"})),

核心原因2:请求携带无效JWT凭证触发认证错误

DRF的执行流程是先执行所有认证类逻辑,再校验权限,你全局配置了JWTAuthentication为默认认证类:
就算视图权限配置为AllowAny,如果请求头里携带了过期、格式错误的Authorization JWT头,JWT认证类会直接抛出身份校验错误,不会走到权限校验步骤。这也是你注册接口没有问题的核心原因:注册接口的POST请求通常不会携带错误的JWT头。

  • 验证方法:发送不带任何Authorization头的GET请求测试接口,如果正常返回即可确认是该问题。
  • 修复方案:重写公开视图的认证类,关闭JWT校验:
class GetUserViewSet(viewsets.GenericViewSet,
                     mixins.ListModelMixin,
                     mixins.RetrieveModelMixin):
    serializer_class = UserSerializer
    permission_classes = [permissions.AllowAny]
    # 清空当前视图的认证类,跳过JWT校验
    authentication_classes = []
    queryset = User.objects.all()

其他排查方向

  • 检查导入的permissions是不是rest_framework.permissions下的原生类,确认没有被自定义权限类覆盖
  • 在GetUserViewSet的list、retrieve方法开头加调试日志,确认请求是否真的进入了该视图,还是被其他视图拦截
  • 检查是否配置了全局JWT认证中间件(非DRF的DEFAULT_AUTHENTICATION_CLASSES配置),全局中间件会在请求进入DRF视图前就校验JWT,不会走视图的权限配置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:15:01