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; ?>
】
相关推荐
- Win11怎么关闭定位服务_保护Win11位置隐私
- Win11怎么查看激活状态_查询Windows 1
- VSC怎样在VSC中调试PHPAPI_接口调试技巧
- 如何在 ACF 中正确更新嵌套多层 Group 字
- How to Properly Use NumPy
- Go 中的 := 运算符:类型推导机制与使用边界详
- PHP 中如何在函数内持久修改引用变量所指向的目标
- 当网站SEO排名下降时,如何应对?
- c++ reinterpret_cast怎么用 c
- c++怎么使用类型萃取type_traits_c+
- php485支持哪些操作系统_php485跨系统支
- c++的static关键字有什么用 静态变量和静态
- 如何在Golang中使用container/hea
- 如何在 Django 中安全修改用户密码而不使会话
- Mac如何修改Hosts文件?(本地开发与屏蔽网站
- Windows电脑如何截屏?(四种快捷方法)
- Windows服务持续崩溃怎样修复_系统服务保护机
- Win11怎么关闭通知中心_Windows11系统
- Win11如何设置文件关联 Win11修改特定文件
- Win11怎么修改DNS服务器 Win11设置DN
- Win10如何设置双wan路由器 Win10双wa
- TestNG的testng.xml配置文件怎么写
- 如何使用Golang指针与接口结合_实现方法调用和
- Mac如何解压zip和rar文件?(推荐免费工具)
- PHP的Workerman对架构扩展有啥帮助_应用
- Win11怎样激活系统密钥_Win11系统密钥激活
- c++怎么处理多线程死锁_c++ lock_gua
- Windows10如何更改鼠标灵敏度_Win10鼠
- Win11怎么关闭应用权限_Windows11相机
- Win11怎么设置单手模式_Win11触控键盘布局
- 使用类变量定义字符串常量时如何实现类型安全的 Li
- 如何使用Golang捕获测试日志_Golang t
- Win11怎么更改任务栏位置_修改注册表将Win1
- Windows怎样拦截WPS弹窗广告_Window
- PHP cURL GET请求:正确设置认证与自定义
- 如何使用Golang table-driven基准
- 如何在Golang中使用内置函数_Golangle
- 如何在Golang中修改数组元素_通过指针实现原地
- windows如何备份注册表_windows导出和
- 如何将文本文件中的竖排字符串转换为横排字符串
- c++ try_emplace用法_c++ map
- c++中的CRTP是什么 c++奇异递归模板模式【
- c++如何判断文件是否存在_c++ filesys
- 如何使用Golang实现多重错误处理_Golang
- 零基础学会Python自动化办公_高效处理Exce
- 如何在 Laravel 中通过嵌套关联关系进行 o
- Win10怎样清理C盘浏览器缓存_Win10清理浏
- c++如何获取map中所有的键_C++遍历键值对提
- Win11怎样彻底卸载自带应用_Win11彻底卸载
- Win11怎么清理C盘系统错误报告_Win11清理

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客服