Django 密码修改后会话失效的解决方案


django 默认在用户密码变更时使旧会话失效,导致用户被登出;需调用 `update_session_auth_hash()` 保持登录状态。

在 Django 中,当用户密码被修改(尤其是通过 user.set_password() 或直接更新 user.password 字段)后,框架会自动使所有基于旧密码哈希生成的会话失效——这是出于安全考虑的默认行为:防止密码泄露后攻击者继续利用已存在的会话令牌。因此,即使用户仍在浏览页面,request.user 也会变为匿名(is_anonymous=True),看似“意外登出”。

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

  1. 未调用 update_session_auth_hash():这是解决该问题的核心。它会重新生成并更新当前会话的认证哈希,使其与新密码匹配;
  2. 手动赋值 user.password = make_password(...) 不推荐:应优先使用 user.set_password(),它不仅加密密码,还会自动处理盐值、算法升级等细节,并兼容后续的 session 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')

        # 验证原密码(注意:check_password 接收明文 vs 哈希)
        if check_password(psswd, request.user.password):
            user = request.user  # 直接使用 request.user,无需重复查询
            user.set_password(new_psswd)  # ✅ 推荐方式:自动处理加密与兼容性
            user.save()

            # ✅ 关键一步:更新当前会话的认证哈希,避免登出
            update_session_auth_hash(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() 之后、响应返回之前调用;
  • 它仅影响当前请求的会话,其他设备/浏览器的会话仍会失效(符合安全设计);
  • 若使用 authenticate() + login() 流程(如登录页),无需手动调用此函数——login() 内部已自动处理;
  • 切勿跳过原密码校验(即 check_password),否则将削弱账户安全性。

总结:Django 的会话自动失效机制是主动的安全防护,而非 bug;正确使用 update_session_auth_hash() 即可在保障安全的前提下提供无缝的密码更新体验。


# word  # html  # go  # 浏览器  # session  # django  # 安全防护 


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


相关推荐: Python函数接口稳定性_版本演进解析【指导】  c# await 一个已经完成的Task会发生什么  Python性能剖析高级教程_cProfileLineProfiler优化案例解析  windows 10专注助手怎么关闭_windows 10禁用通知提醒功能方法  Win11如何设置文件权限 Win11 NTFS文件夹所有权与安全设置【高级】  Win10电脑怎么设置网络名称_Windows10注册表NetworkList修改  如何解决同一段404代码在不同主机上表现不一致的问题  Python路径拼接规范_跨平台处理说明【指导】  Win11怎么打开注册表_Windows 11注册表编辑器启动命令【步骤】  PHP中require语句后直接调用返回对象方法的语法解析  Win11如何设置环境变量 Win11添加和修改系统与用户变量【教程】  如何用正则表达式精确匹配最多含一个换行符的起止片段  c++的STL算法库find怎么用 在容器中查找指定元素【实用教程】  如何用列表一次性对 DataFrame 的指定列应用字典映射  mac怎么分屏_MAC双屏显示与分屏操作技巧【指南】  c++ namespace命名空间用法_c++避免命名冲突  如何使用Golang实现路由参数绑定_使用Mux和Request解析路径变量  如何在 Go 中正确反序列化多个并列的 XML 元素(而非 XML 数组)  如何在Golang中处理URL参数_Golang URL参数解析与路由映射方法  Win11怎么关闭系统声音_Win11系统提示音静音设置【详解】  Mac的“预览”如何合并多个PDF_Mac文件处理技巧【效率】  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  Drupal 中 HTML 链接被双重转义导致渲染异常的解决方案  php485在php5.6下能用吗_php485旧版本兼容性问题说明【详解】  使用类变量定义字符串常量时的类型安全最佳实践  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  Laravel 查询 JSON 列:高效筛选包含数组中任意值的记录  Mac如何修改Hosts文件?(本地开发与屏蔽网站)  如何使用Golang捕获并记录协程panic_保证主程序稳定运行  MAC如何启用访达侧边栏显示_MAC Finder偏好设置与常用目录添加【教程】  MySQL 中使用 IF 和 CASE 实现查询字段的条件转换  Windows10无法连接到Internet_Win10网络重置命令详解  Win11怎么关闭SmartScreen_禁用Windows Defender筛选器教程【步骤】  Win11怎么设置鼠标宏_Win11鼠标按键自定义编程教程【详解】  如何提升Golang程序I/O性能_Golang I/O密集型程序优化示例  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  Win10路由器怎么隐藏ssid Win10隐藏wifi名称设置【指南】  如何在 ACF 中正确更新嵌套多层的 Group 字段子字段  Windows笔记本无法进入睡眠模式怎么办?(电源疑难解答)  php转mp4怎么保留字幕_php处理带字幕视频转换说明【说明】  Win11怎么开启专注模式_Windows11时钟应用Focus Session  如何从 Go 的 map[string]interface{} 中安全获取值  Windows11怎样开启游戏模式_Windows11游戏模式开启攻略【方法】  Windows怎样关闭桌面弹窗广告_Windows关闭桌面弹窗设置【教程】  Win10 BitLocker加密教程 Win10给磁盘驱动器上锁【安全】  如何在 ACF 中正确更新嵌套多层 Group 字段内的子字段  如何高效删除 NumPy 二维数组中所有元素相同的列  Win11 C盘满了怎么清理 Win11磁盘清理和存储感知使用教程【新手必看】  Windows怎样拦截WPS弹窗广告_Windows拦截WPS弹窗广告设置【步骤】  Linux怎么禁止Root用户远程登录_Linux系统SSH加固与安全设置【教程】 

 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.