Django DRF+SimpleJWT权限异常:Postman拦截有效但Angular未拦截
排查与解决步骤
1. 先确认Angular请求的真实状态
打开浏览器F12开发者工具,切换到网络标签,发起请求后:
- 检查请求头里有没有
Authorization: Bearer <token>字段,如果有,说明前端可能缓存了之前的有效token(比如localStorage没清); - 查看响应状态码和内容,确认后端是否真的返回了未授权数据,还是前端做了本地缓存。
2. 检查视图集是否覆盖了全局权限
你的settings.py已经配置了全局默认权限IsAuthenticated,但要确认:
- 所有视图集(比如
CampingViewSet、ClientViewSet)有没有局部设置permission_classes = [AllowAny]或者其他宽松权限,覆盖了全局规则; - 检查所有视图代码,确保没有绕过权限的配置。
3. 排查认证后端的冲突
你的AUTHENTICATION_BACKENDS里同时配置了TokenAuthentication和JWT认证,这可能导致:
- 如果前端请求里带有DRF的Token认证头(不是JWT),会被
TokenAuthentication处理,若恰好有有效Token就会绕过JWT认证; - 先注释掉
rest_framework.authentication.TokenAuthentication,测试是否还能未授权访问:AUTHENTICATION_BACKENDS = [ # 'rest_framework.authentication.TokenAuthentication', # 临时注释 'django.contrib.auth.backends.ModelBackend', 'axes.backends.AxesStandaloneBackend', ]
4. 完善CORS头配置
虽然你自定义了静态文件的CORS处理,但API请求的CORS头由corsheaders中间件处理:
- 确认没有设置
CORS_ALLOW_ALL_ORIGINS = True(这个会放开所有来源,可能导致权限绕过的错觉); - 确保
CORS_ALLOW_HEADERS包含Authorization头,若自定义了该配置,手动加上:CORS_ALLOW_HEADERS = [ 'accept', 'accept-encoding', 'authorization', 'content-type', 'dnt', 'origin', 'user-agent', 'x-csrftoken', 'x-requested-with', ]
5. 直接用浏览器测试API
在浏览器地址栏输入API的URL(比如http://127.0.0.1:8000/client/):
- 如果浏览器也能直接访问,说明问题在后端权限配置,和前端无关;
- 如果浏览器返回认证错误,那问题出在Angular请求的处理上,比如前端自动带上了认证信息(比如session cookie,但JWT默认不依赖session,可能是其他配置问题)。
6. 开启DRF调试日志排查认证过程
在settings.py添加日志配置,查看认证和权限检查的细节:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': {'class': 'logging.StreamHandler'}, }, 'loggers': { 'rest_framework': { 'handlers': ['console'], 'level': 'DEBUG', }, }, }
发起请求后查看控制台日志,确认DRF是否执行了认证和权限检查步骤,有没有跳过的情况。
内容的提问来源于stack exchange,提问作者tchouang
相关产品推荐
相关产品推荐

