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

为什么DRF的IsAuthenticatedOrReadOnly权限类允许未认证用户发起POST请求

核心问题原因

你遇到的情况最可能来自以下几个配置漏洞,按出现概率从高到低排序:

1. 自定义了DRF的SAFE_METHODS配置

IsAuthenticatedOrReadOnly的核心逻辑是:只要请求方法属于DRF定义的安全方法列表,就无条件放行;非安全方法才要求登录。
默认的SAFE_METHODS为 ('GET', 'HEAD', 'OPTIONS'),如果你在settings.py的REST_FRAMEWORK配置里,或者在视图/全局配置中手动把POST加入了安全方法列表,匿名用户的POST请求就会被IsAuthenticatedOrReadOnly放行,完全符合你遇到的现象:

  • 用IsAuthenticatedOrReadOnly时POST请求通过,测试返回201
  • 换成IsAuthenticated时,无论请求方法是什么都要求登录,测试返回403失败

排查方法:全局搜索你项目中的SAFE_METHODS关键字,确认是否有自定义修改。

2. 权限类导入错误

确认你视图中导入的IsAuthenticatedOrReadOnly是DRF官方的权限类:

from rest_framework.permissions import IsAuthenticatedOrReadOnly

如果误导入了项目中自定义的同名权限类,可能逻辑和官方不同导致匿名POST被放行。

3. 视图权限逻辑被覆盖

检查你的PostList视图是否重写了get_permissions()方法,或者继承了包含AllowAny权限的混合类,导致你显式定义的permission_classes被覆盖失效。

4. 测试环境特殊配置

排查你测试环境的settings.py中是否有调试用的权限绕过配置,比如全局默认权限设为AllowAny、或者加了跳过权限校验的调试中间件。同时确认测试用例中请求的URL确实匹配到了你配置了权限的PostList视图,没有绑错路由。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:36:00