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

Django普通用户认证失败:后台存在用户却无法登录

Django普通用户authenticate()认证失败排查与解决

常见原因及修复步骤

1. 普通用户的is_active状态为False

Django的authenticate()函数默认仅返回**is_active=True**的用户对象。超级用户创建时默认is_active为True,但手动创建普通用户时可能误取消了该选项。

检查方式:
进入Django后台,打开该普通用户的详情页,查看「Active」选项是否勾选。

修复方式:
勾选「Active」并保存用户;或通过代码批量激活:

from django.contrib.auth.models import User
User.objects.filter(username="目标普通用户名").update(is_active=True)

2. 普通用户密码未正确哈希存储

若创建普通用户时未使用Django提供的正确流程(比如后台直接修改密码字段为明文,而非点击「Set password」按钮),密码会以明文存储,而authenticate()仅验证哈希后的密码,导致匹配失败。

修复方式:
进入Django后台编辑该用户,点击「Set password」按钮重新设置密码并保存(Django会自动完成哈希处理)。

若用代码创建用户,必须使用create_user方法而非直接User.objects.create():

user = User.objects.create_user(username="普通用户名", password="合法密码")
user.save()

3. 自定义用户模型的认证后端配置问题(若有)

如果项目自定义了User模型,需确保settings.py中配置了正确的认证后端:

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    # 自定义认证后端(如果存在)
]

因超级用户可正常认证,此问题概率较低,可作为最终排查项。

代码优化建议

  • 处理POST参数时,改用.get()方法避免KeyError:
    enteredname = HttpRequest.POST.get('username', '')
    enteredpassword = HttpRequest.POST.get('password', '')
    
  • seeDataHtml中渲染的User.password是哈希值,无实际展示意义,建议移除该字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:40:17