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

自定义权限类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

额外注意事项

  1. 确保DRF已配置认证类,否则request.user会是匿名用户,is_superuser永远为False,导致所有写入操作被拒绝。在settings.py中添加:
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ],
}
  1. 自定义User模型继承了AbstractUser,is_superuser是自带字段,需确保你的管理员账号确实被标记为超级用户。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:48:24