为什么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
相关产品推荐
相关产品推荐

