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

DRF登录验证问题:禁用用户登录返回无效凭证的原因及后端风险

问题分析与解决方案

为什么is_active=False的用户会返回「Invalid credentials」

Django默认的ModelBackend认证后端执行auth.authenticate()时,会自动过滤掉is_active=False的用户,直接返回None。这就导致你的validate方法里,明明用户存在且密码正确,却进入了else分支,抛出无效凭证的错误,而非你期望的「Account is disabled」提示。

解决方法

将认证后端配置为AllowAllUsersModelBackend,这个后端不会过滤非活跃用户,会返回完整的用户对象,这样你就能在validate方法里自行校验is_active状态,返回对应的错误信息:

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.AllowAllUsersModelBackend'
]

修改后,你的测试用例就能触发「Account is disabled, contact admin」的错误,返回401状态码,符合预期。

使用AllowAllUsersModelBackend的风险

  • 全局认证校验负担增加:所有调用auth.authenticate()的地方,都需要手动检查用户的is_active状态。如果某个自定义认证路径遗漏了这个校验,非活跃用户(比如被封禁的账号)就能成功登录,违背账户禁用的设计初衷。
  • 第三方模块兼容性风险:虽然Django Admin等官方模块会额外校验is_active,但部分第三方库或自定义插件如果直接依赖auth.authenticate()的返回结果,未自行做校验,可能导致非活跃用户获得访问权限。
  • 安全隐患:后续代码维护中若遗漏is_active校验,会直接让被封禁的用户重新获得系统访问权,带来数据泄露或恶意操作的风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:26:01