Django使用simple_jwt鉴权未传token请求正常通过问题咨询
问题原因
DRF 框架中认证规则和权限规则是两套独立的逻辑,你仅配置了全局JWT认证类,没有配置接口访问权限规则:
- 认证类仅负责解析请求携带的身份凭证:如果携带的token无效,直接返回401;如果未携带token,只会将请求用户标记为匿名用户,不会主动拦截请求。
- 你没有配置权限规则时,DRF默认使用
AllowAny权限,即匿名用户也可以正常访问所有接口,这就是未带token仍能请求成功的核心原因。
解决方案
你可以根据需求选择以下任意一种方案:
方案1:全局配置所有接口默认需要登录
修改你的settings.py中REST_FRAMEWORK配置,新增默认权限类:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_simplejwt.authentication.JWTAuthentication', ], # 新增默认权限配置:所有接口默认要求登录 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ] }
如果存在无需登录即可访问的接口(如登录、注册接口),单独在对应视图中指定permission_classes = [rest_framework.permissions.AllowAny]即可。
方案2:仅给指定接口添加登录校验
如果不需要全局拦截,仅针对当前SetPin接口做鉴权,直接修改视图代码添加权限属性即可:
from rest_framework.permissions import IsAuthenticated class SetPin(generics.CreateAPIView): """修改或设置pin码""" serializer_class = serializers.PinSerializer # 新增权限配置:要求必须携带有效token才能访问 permission_classes = [IsAuthenticated]
配置完成后,未携带Authorization: Bearer token的请求就会被权限校验拦截,返回403/401状态码,和错误token的逻辑保持一致。
内容的提问来源于stack exchange,提问作者Kabiljan Tanaguzov
相关产品推荐
相关产品推荐

