Django 密码修改后会话失效的解决方案
技术百科
霞舞
发布时间:2026-01-01
浏览: 次 django 默认在用户密码变更时使旧会话失效,导致用户被登出;需调用 `update_session_auth_hash()` 保持登录状态。
在 Django 中,当用户密码被修改(尤其是通过 user.set_password() 或直接更新 user.password 字段)后,框架会自动使所有基于旧密码哈希生成的会话失效——这是出于安全考虑的默认行为:防止密码泄露后攻击者继续利用已存在的会话令牌。因此,即使用户仍在浏览页面,request.user 也会变为匿名(is_anonymous=True),看似“意外登出”。
你当前的视图中存在两个关键问题:
- 未调用 update_session_auth_hash():这是解决该问题的核心。它会重新生成并更新当前会话的认证哈希,使其与新密码匹配;
- 手动赋值 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
# go
# html
# session
# django
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何在Golang中实现基础配置管理功能_Gola
- Python爬虫项目实战教程_Scrapy抓取与存
- Windows家庭版如何开启组策略(gpedit.
- C#如何使用XPathNavigator高效查询X
- 如何使用Golang编写单元测试_创建Test函数
- 企业SEO优化选择网站建设模板的技巧
- 为什么Go建议使用error接口作为错误返回_Go
- 如何在Golang中实现微服务负载均衡_Golan
- Mac如何解压zip和rar文件?(推荐免费工具)
- 电脑无法识别U盘怎么办 Windows磁盘管理与驱
- Windows怎样关闭Edge新标签页广告_Win
- Windows10怎样设置家长控制_Windows
- VSC怎么快速定位PHP错误行_错误追踪设置法【方
- c++怎么实现高并发下的无锁队列_c++ std:
- Win10如何更改开机密码_Windows10登录
- c++怎么处理多线程死锁_c++ lock_gua
- 如何在 Go 中正确初始化结构体中的 map 字段
- php订单日志怎么在swoole写_php协程sw
- 如何在 Go 中创建包含 map 的 slice(
- Win11任务栏怎么固定应用 Win11将软件图标
- c# 在高并发场景下,委托和接口调用的性能对比
- Python配置文件操作教程_JSONINIYAM
- 如何在 ACF 中正确更新嵌套多层的 Group
- 怎么将XML数据可视化 D3.js加载XML
- 如何关闭Win10自动更新更新_Win10系统自动
- Python与OpenAI接口集成实战_生成式AI
- Python实现图数据库操作_Neo4j核心CRU
- 如何在 Go 中正确测试带 Cookie 的 HT
- 作用域操作符会影响性能吗_php静态调用性能分析【
- 如何使用Golang实现路由参数绑定_使用Mux和
- Win11搜索栏无法输入_解决Win11开始菜单搜
- 本地php环境打开php文件直接下载_浏览器解析p
- Win10如何卸载WindowsDefender_
- Win11怎么设置任务栏大小_Windows11注
- Win11此电脑不在桌面上_Windows 11桌
- VSC怎样在Linux运行PHP_Ubuntu系统
- Python日志系统设计与实现_高可观测性架构实战
- windows如何修改文件默认打开方式_windo
- Go语言中CookieJar的持久化机制解析:内存
- Python抽象类与接口设计_规范说明【指导】
- 如何在Golang中修改数组元素_通过指针实现原地
- Win11任务栏天气怎么关闭 Win11隐藏天气小
- Win11怎么清理C盘OneDrive缓存_Win
- Win10如何卸载微软拼音输入法 Win10只保留
- php能控制zigbee模块吗_php通过串口与c
- LINUX的SELinux是什么_详解LINUX强
- Win11怎么退出高对比度模式_Win11取消反色
- Windows的便笺功能如何使用?(桌面备忘技巧)
- php查询数据怎么导出csv_查询结果转csv文件
- Win11怎么关闭VBS安全性_Windows11

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', {})
QQ客服