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,即“会话被冲刷”。
你当前的视图存在两个关键问题:
✅ 正确做法是使用 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 su
ccessfully!')
return render(request, 'User/userPsswdReset.html')
return render(request, 'User/userPsswdReset.html')⚠️ 注意事项:
总结:密码变更触发会话失效是 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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。