django 默认会在用户密码变更后自动失效旧会话,导致用户登出;解决方法是调用 `update_session_auth_hash()` 保留当前登录状态。
在 Django 中,当用户密码被修改(例如通过自定义视图 psswdReset),框架出于安全考虑会主动使所有基于旧密码的会话失效——这是默认行为,并非 Bug。其原理在于:Django 的认证中间件会比对当前 session 中存储的哈希签名与用户 password 字段的哈希值。一旦 user.password 被直接更新(如 user.password = make_password(...)),而未同步更新 session 的认证标识,下次请求时 AuthenticationMiddleware 将检测到不一致,强制将 request.user 置为 AnonymousUser,即“会话被冲刷”。
您当前的代码存在两个关键问题:
✅ 正确做法如下(推荐使用 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.chec
k_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')? 注意事项:
? 总结:密码修改后会话丢失是 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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。