自定义权限类WriteByAdminOnlyPermission失效问题排查与解决请求
问题排查与解决方案
核心错误点
你的权限类里的条件判断存在语法逻辑错误:
if request.method in['POST' or 'PUT' or 'DELETE'] and user.is_superuser:
'POST' or 'PUT' or 'DELETE'的运算结果是'POST',所以这个列表实际等价于['POST'],导致PUT、DELETE方法完全没进入权限校验逻辑,任何用户都能执行这两个操作。
修复后的权限类代码
简化逻辑,直接区分查看和写入操作:
class WriteByAdminOnlyPermission(BasePermission): def has_permission(self, request, view): # 所有用户允许GET类请求(含HEAD、OPTIONS) if request.method in ('GET', 'HEAD', 'OPTIONS'): return True # 写入操作仅允许超级用户执行 return request.user.is_superuser
额外注意事项
- 确保DRF已配置认证类,否则
request.user会是匿名用户,is_superuser永远为False,导致所有写入操作被拒绝。在settings.py中添加:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', ], }
- 自定义User模型继承了
AbstractUser,is_superuser是自带字段,需确保你的管理员账号确实被标记为超级用户。
内容的提问来源于stack exchange,提问作者Mossaddak
相关产品推荐
相关产品推荐

