如何在 Django 中安全修改用户密码而不使会话失效


django 默认在用户密码变更后自动清除其会话,导致用户登出;解决方法是调用 `update_session_auth_hash()` 保留当前登录状态。

在 Django 中,当用户密码被修改(例如通过自定义视图 psswdReset),框架出于安全考虑会主动使所有基于旧密码哈希的会话失效——这是默认行为,并非 Bug。其原理在于:Django 将用户密码哈希值嵌入 session 数据的认证签名中(通过 SESSION_AUTH_HASH 机制)。一旦 user.password 字段更新,request.user.get_session_auth_hash() 返回值随之改变,而现有 session 中存储的旧 auth hash 不再匹配,中间件(AuthenticationMiddleware)检测到不一致后,便将 request.user 重置为 AnonymousUser,即“会话被冲刷”。

你当前的视图存在两个关键问题:

  1. 未调用 update_session_auth_hash() → 导致会话立即失效;
  2. 直接赋值 user.password = make_password(...) 并 .save() → 绕过了 Django 用户模型的密码设置逻辑(如信号触发、密码验证等),且未更新 session 认证哈希。

✅ 正确做法是使用 set_password() 方法(它会自动哈希并触发相关逻辑),并在保存后立即调用 update_session_auth_hash(request):

from django.contrib.auth import update_session_auth_hash
from django.contrib import messages

def psswdReset(request):
    if request.method == 'POST':
        new_psswd = request.POST.get('new_psswd')
        psswd = request.POST.get('psswd')

        # 验证旧密码(推荐使用 check_password)
        if not check_password(psswd, request.user.password):
            messages.error(request, 'Current password is incorrect.')
            return render(request, 'User/userPsswdReset.html')

        # ✅ 安全设置新密码(自动哈希 + 触发信号)
        request.user.set_password(new_psswd)
        request.user.save()

        # ✅ 关键:更新 session 的认证哈希,保持登录态
        update_session_auth_hash(request, request.user)

        messages.success(request, 'Password changed successfully!')
        return render(request, 'User/userPsswdReset.html')

    return render(request, 'User/userPsswdReset.html')

⚠️ 注意事项:

  • update_session_auth_hash() 必须在 user.save() 之后、响应返回之前调用;
  • 不要手动操作 user.password 字段,始终优先使用 set_password();
  • 若使用 CustomUser 模型,请确保其继承自 AbstractBaseUser 或 AbstractUser,并正确实现了 set_password;
  • 此机制依赖 django.contrib.auth.middleware.AuthenticationMiddleware,请确认已启用。

总结:密码变更触发会话失效是 Django 的内置安全防护,而非异常。只需在修改密码后显式调用 update_session_auth_hash(request, user),即可无缝延续用户会话,兼顾安全性与用户体验。


# word  # html  # go  # session  # 解决方法  # django  # 安全防护  # 中间件 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Python对象生命周期管理_创建销毁解析【教程】  Windows10系统怎么查看已安装更新_Win10控制面板卸载补丁  Ajax提交表单PHP怎么接收_处理Ajax发送的表单数据技巧【指南】  Win11怎么关闭透明效果_Windows11个性化颜色关闭透明  Windows 11怎么设置默认解压软件_Windows 11为ZIP/RAR文件指定默认打开程序  Python音视频处理高级项目教程_FFmpegPydub剪辑与特效  Win10任务栏天气和资讯怎么关闭 Win10禁用新闻和兴趣功能【教程】  Mac的访达(Finder)怎么用_Mac文件管理入门教程【详解】  本地php环境出现502错误_nginx或apache502badgateway解决技巧【解答】  Windows Defender扫描失败怎么办_安全模块损坏修复方式  Windows 10怎么隐藏特定更新补丁_Windows 10使用微软官方工具wushowhide.diagcab  用Python构建微服务架构实践_FastAPI与Django对比详解  ACF 教程:正确更新嵌套在多层 Group 字段内的子字段  Win10电脑怎么设置休眠快捷键_Windows10电源按钮功能定义  如何使用Golang实现文件追加操作_向已有文件追加数据  新手学PHP架构总混淆概念咋办_重点梳理【教程】  php订单日志怎么导出excel_php导出订单日志到表格教程【教程】  Mac如何将HEIC图片格式转为JPG_Mac批量转换图片【指南】  如何更改Windows资源管理器的默认启动位置?(快速访问/此电脑)  php中self::能调用子类重写的方法吗_静态绑定与重写关系【介绍】  Python异步编程高级项目教程_asyncio协程任务管理实战  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  php485返回空数组怎么回事_php485数据接收为空排查指南【详解】  Python脚本参数接收_sys与argparse解析【指导】  php增删改查在php8里有什么变化_新特性对curd的影响【指南】  Win11怎么更改电脑密码_Windows 11修改本地账户密码【步骤】  微信里的php文件怎么变mp4_微信接收php转mp4操作步骤【操作】  PHP主流架构怎么集成Redis缓存_配置步骤【方法】  Win11无法安装软件怎么办_Win11解除应用安装限制设置【修复】  Windows10如何更改桌面图标间距_Win10注册表WindowMetrics修改  如何在Golang中定义接口_抽象方法和多态实现  如何在 Python 测试中动态配置 @backoff 装饰器的重试次数  Win11怎么开启移动热点_Windows11共享网络给手机设置教程  Windows10系统服务优化指南_Win10禁用不必要服务提升性能  Win10如何关闭安全中心所有通知 Win10禁用Windows Defender提醒【设置】  如何在 Go 应用中实现自动错误恢复与进程重启机制  Python邮件系统自动化教程_批量发送解析与模板应用  Win11怎么设置默认邮件应用_Windows11应用关联Mail设置  Go 语言标准库为何不提供泛型切片的 Contains 方法?  Win11怎么设置DNS服务器_Windows11修改网络适配器DNS优选  Mac电脑如何恢复出厂设置_Mac抹掉数据并重装系统【安全指南】  MySQL 中使用 IF 和 CASE 实现查询字段条件化显示  Windows如何拦截2345弹窗广告_Windows拦截2345弹窗方法【步骤】  Windows10无法识别USB设备描述符请求失败_通用串行总线控制器修复  php8.4匿名类怎么用_php8.4匿名类创建与使用场景【介绍】  Win11怎么关闭自动维护 Win11禁用系统自动维护功能【优化】  PHP 中如何在函数内持久化修改引用变量的指向  php修改数据怎么改富文本_update更新html内容注意事项【说明】  Win11怎么关闭触控板_Win11笔记本禁用触摸板快捷键  Go 中 defer 在 goroutine 内部不生效的原因与执行时机详解 

 2026-01-01

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.