如何在 Django 中修改用户密码后保持会话不丢失


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

在 Django 中,当用户密码被修改(例如通过自定义视图 psswdReset),框架出于安全考虑会主动使所有基于旧密码的会话失效——这是默认行为,并非 Bug。其原理在于:Django 的认证中间件会比对当前 session 中存储的哈希签名与用户 password 字段的哈希值。一旦 user.password 被直接更新(如 user.password = make_password(...)),而未同步更新 session 的认证标识,下次请求时 AuthenticationMiddleware 将检测到不一致,强制将 request.user 置为 AnonymousUser,即“会话被冲刷”。

您当前的代码存在两个关键问题:

  1. 未调用 update_session_auth_hash():这是最核心的修复点;
  2. 手动赋值 user.password 并保存:虽可行,但绕过了 Django 用户模型的安全更新逻辑,易遗漏信号或钩子。

✅ 正确做法如下(推荐使用 set_password() + update_session_auth_hash()):

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')

        # 验证原密码正确性
        if not request.user.check_password(psswd):
            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(request, user) 必须在 user.save() 之后调用,且 user 必须是当前已认证的用户实例(通常为 request.user);
  • 不要使用 check_password(psswd, request.user.password) 手动比对——应直接调用 request.user.check_password(),它更安全且兼容自定义密码 hasher;
  • 若使用 CustomUser 模型,请确保其继承自 AbstractBaseUser 或 AbstractUser,并正确实现了 set_password() 方法;
  • 该机制仅影响当前用户的活跃会话,其他设备/浏览器的会话仍会被安全地注销(符合预期)。

? 总结:密码修改后会话丢失是 Django 的主动安全防护机制,而非缺陷。只需在保存新密码后调用 update_session_auth_hash(),即可在保障安全性的同时提供无缝的用户体验。


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


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


相关推荐: php485在macos下怎么配置_php485 macOS系统配置指南【解答】  MySQL 中使用 IF 和 CASE 实现查询字段的条件映射  Win11如何更改任务栏颜色 Win11自定义任务栏背景色【美化】  c++ reinterpret_cast怎么用 c++最危险的类型转换【详解】  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  Django 测试数据库表缺失与字段未创建问题的完整解决方案  Win11怎么开启窗口对齐助手_Windows11系统多任务处理设置  Windows10如何更改鼠标图标_Win10鼠标属性指针浏览  Win11怎么设置默认邮件客户端 Win11修改Mail应用关联【教程】  Win11怎么连接蓝牙耳机_Win11蓝牙设备配对与连接教程【步骤】  Windows10如何更改日期格式_Win10区域设置短日期修改  Win11怎么更改系统语言_Win11中文语言包下载与安装【指南】  mac怎么查看wifi密码_MAC查看已连接WiFi密码方法【技巧】  如何在 Go 中创建包含 map 的 slice(嵌套数据结构)  Python路径拼接规范_跨平台处理说明【指导】  微信企业付款回调PHP怎么接收_处理企业付款异步通知数据教程【教程】  php命令行怎么运行_通过CLI模式执行PHP脚本的步骤【说明】  Win11麦克风没声音怎么设置_Win11麦克风权限及驱动修复【教程】  MAC的“接续互通”功能无法使用怎么办_MAC检查蓝牙、Wi-Fi和相同Apple ID登录  Python生成器表达式内存优化_惰性计算说明【指导】  Python抽象类与接口设计_规范说明【指导】  php怎么下载安装后设置错误日志_phpini log配置教程【汇总】  Win11怎么修复系统文件_使用sfc命令修复Win11系统【技巧】  Win11怎么更改输入法顺序_Win11调整语言首选位置【设置】  MAC如何修改默认应用程序_MAC文件后缀关联设置与打开方式更改【教程】  如何使用Golang构建简易投票统计功能_Golang投票数据汇总与展示示例  如何在 Django 中安全修改用户密码而不使会话失效  php怎么下载安装后测试是否成功_简单脚本验证方法【操作】  Win11讲述人怎么关闭_Win11误触开启语音朗读关闭【快捷键】  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  Win11怎样激活系统密钥_Win11系统密钥激活步骤【攻略】  如何在 Go 同包不同文件中正确引用结构体  Win11如何连接Xbox手柄 Win11蓝牙连接游戏手柄教程【步骤】  如何使用Golang优化模块引入路径_Golanggo mod tidy清理与优化方法  c++如何用AFL++进行模糊测试 c++ Fuzzing入门【安全】  php下载安装选zip还是msi格式_两种安装包对比【教程】  Linux怎么设置磁盘配额_Linux系统Quota安装与用户空间限制【教程】  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  如何使用Golang处理网络超时错误_Golang请求超时异常处理方法  Golang如何实现基本的用户注册_Golang用户注册表单处理示例  c# Task.ConfigureAwait(true) 在什么场景下是必须的  Windows 10自带杀毒软件在哪_Windows 10打开和使用Windows安全中心  Win11截图快捷键是什么_Win11自带截图工具使用技巧【汇总】  php删除数据怎么加限制_带where条件删除避免全删【指南】  如何使用Golang反射将map转换为struct_Golang reflect类型映射技巧  如何在JavaScript中动态拼接PHP的base_url与前端变量  如何使用Golang实现Web表单数据绑定_自动映射字段到结构体  Windows11怎么自定义任务栏_Windows11任务栏自定义教程【步骤】  PHP 中如何在函数内持久化修改引用变量的指向  Win11如何开启系统更新 Win11开启系统更新方法【步骤】 

 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.