如何在 Django 中安全修改用户密码而不使会话失效
技术百科
霞舞
发布时间:2026-01-01
浏览: 次 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,即“会话被冲刷”。
你当前的视图存在两个关键问题:
- 未调用 update_session_auth_hash() → 导致会话立即失效;
-
直接赋值 user.password = make_password(...) 并 .save() → 绕过了 Django 用户模型的密码设置逻辑(如信号触发、密
码验证等),且未更新 session 认证哈希。
✅ 正确做法是使用 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 successfully!')
return render(request, 'User/userPsswdReset.html')
return render(request, 'User/userPsswdReset.html')⚠️ 注意事项:
- update_session_auth_hash() 必须在 user.save() 之后、响应返回之前调用;
- 不要手动操作 user.password 字段,始终优先使用 set_password();
- 若使用 CustomUser 模型,请确保其继承自 AbstractBaseUser 或 AbstractUser,并正确实现了 set_password;
- 此机制依赖 django.contrib.auth.middleware.AuthenticationMiddleware,请确认已启用。
总结:密码变更触发会话失效是 Django 的内置安全防护,而非异常。只需在修改密码后显式调用 update_session_auth_hash(request, user),即可无缝延续用户会话,兼顾安全性与用户体验。
# 解决方法
# 安全防护
# 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; ?>
】
相关推荐
- Win11如何关闭小娜Cortana Win11禁
- 如何在Golang中引入测试模块_Golang测试
- 如何在 ACF 中正确更新嵌套多层的 Group
- 本地php环境打开php文件直接下载_浏览器解析p
- Win11怎么关闭开机声音_Win11系统启动提示
- Windows11怎么用“记事本”自动换行与编码
- Windows蓝屏错误0x0000001E怎么修复
- Win11截图快捷键是什么_Win11自带截图工具
- 如何在JavaScript中动态拼接PHP的bas
- c++怎么使用std::tuple存储多元组数据_
- 微信企业付款回调PHP怎么接收_处理企业付款异步通
- Drupal 中 HTML 链接被重复转义导致渲染
- windows如何修改文件默认打开方式_windo
- Win11怎么开启窗口对齐助手_Windows11
- Win10电脑C盘红了怎么清理_Windows10
- php中$this和::能混用吗_对象与静态作用域
- Win11怎么设置任务栏图标大小_Windows1
- PHP 中如何在函数内持久化修改引用变量的指向
- php查询数据怎么分组_groupby分组查询配合
- PythonGIL机制理解_多线程限制解析【教程】
- Win11怎样安装网易云音乐_Win11安装网易云
- c++ nullptr与NULL区别_c++11空
- Win11怎么设置系统还原_Windows11系统
- Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数
- Windows10如何彻底关闭自动更新_Win10
- Go 中 := 短变量声明的类型推导机制详解
- Win11怎么设置声音输出设备_Windows11
- 如何在 Go 开发中正确处理本地包导入与远程模块路
- c++中如何使用std::variant_c++1
- Win11怎么开启HDR模式_Windows 11
- php修改数据怎么批量改状态_批量更新status
- 如何使用Golang编写单元测试_创建Test函数
- C++中的std::shared_from_thi
- 如何在Golang中解压文件_Golang com
- Windows10系统怎么查看防火墙状态_Win1
- 企业SEO优化选择网站建设模板的技巧
- php怎么操作Redis_Redis扩展连接与基本
- 如何使用Golang实现容器自动化运维_Golan
- 如何使用Golang构建基础消息队列模拟_Gola
- Win11怎么更改任务栏位置_修改注册表将Win1
- Win11怎么忘记WiFi网络_Win11删除已保
- c# 如何用c#实现一个支持优先级的任务队列
- Windows10电脑怎么设置防火墙出站规则_Wi
- 如何在 Go 中正确反序列化多个同级 XML 元素
- PHP cURL GET请求:正确设置请求头与身份
- c++如何打印函数堆栈信息_c++ backtra
- VSC怎么在PHP中调试MySQL_数据库交互排查
- Win11怎么关闭边缘滑动手势_Windows11
- Win11怎么关闭搜索历史_Win11清除任务栏搜
- Mac怎么查看活动监视器_理解Mac进程和资源占用

码验证等),且未更新 session 认证哈希。
QQ客服