电话
400 9058 355
django在用户密码更新后自动使当前会话失效,导致用户登出(变为匿名用户),这是出于安全默认行为;需调用`update_session_auth_hash()`保留登录状态。
在Django中,当用户密码被修改(例如通过自定义视图 psswdReset)时,框架会主动使当前会话失效——即用户立即被登出,request.user.is_anonymous 变为 True。这一机制是Django内置的安全防护措施,目的是防止密码被篡改后旧会话仍可继续访问敏感资源(如会话劫持或凭证泄露场景下的横向移动)。
但对用户体验而言,这往往不理想:用户刚成功修改密码,却立刻跳转到登录页,需重新输入凭证。解决方法非常明确:在密码保存后,立即调用 update_session_auth_hash(request, user),通知Django该用户的认证凭据已更新,但当前会话仍可信,应予以延续。
以下是修复后的视图代码(关键修改已加注释):
from django.contrib.auth import update_session_auth_hash
from django.contrib import messages
from django.contrib.auth.hashers import check_password, make_password
from django.shortcuts import render
def psswdReset(request):
if request.method == 'POST':
new_psswd = request.POST.get('new_psswd')
psswd = request.POST.get('psswd')
# 验证原密码正确性(推荐使用 request.user.check_password
() 更简洁)
if not request.user.check_password(psswd):
messages.error(request, 'Current password is incorrect.')
return render(request, 'User/userPsswdReset.html')
# 更新密码(推荐使用 set_password() 而非直接赋值 password 字段)
request.user.set_password(new_psswd)
request.user.save()
# ✅ 关键一步:保持当前会话有效,避免自动登出
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的安全设计原则。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...