全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何在 Django 中安全修改用户密码而不使会话失效

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,即“会话被冲刷”。

你当前的视图存在两个关键问题:

  1. 未调用 update_session_auth_hash() → 导致会话立即失效;
  2. 直接赋值 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  # html  # go  # session  # 解决方法  # django  # 安全防护  # 中间件 


相关文章: 济南网站建设制作公司,室内设计网站一般都有哪些功能?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  PHP正则匹配日期和时间(时间戳转换)的实例代码  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  PHP 500报错的快速解决方法  常州自助建站费用包含哪些项目?  建站之星24小时客服电话如何获取?  北京的网站制作公司有哪些,哪个视频网站最好?  如何快速搭建安全的FTP站点?  魔方云NAT建站如何实现端口转发?  电商网站制作公司有哪些,1688网是什么意思?  兔展官网 在线制作,怎样制作微信请帖?  如何在阿里云通过域名搭建网站?  如何用虚拟主机快速搭建网站?详细步骤解析  测试制作网站有哪些,测试性取向的权威测试或者网站?  建站之星安装需要哪些步骤及注意事项?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  C++如何使用std::optional?(处理可选值)  股票网站制作软件,网上股票怎么开户?  已有域名和空间如何快速搭建网站?  建站主机无法访问?如何排查域名与服务器问题  如何通过NAT技术实现内网高效建站?  家庭建站与云服务器建站,如何选择更优?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  如何通过虚拟主机快速搭建个人网站?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  清除minerd进程的简单方法  建站之星在线客服如何快速接入解答?  Java解压缩zip - 解压缩多个文件或文件夹实例  企业微网站怎么做,公司网站和公众号有什么区别?  官网网站制作腾讯审核要多久,联想路由器newifi官网  开心动漫网站制作软件下载,十分开心动画为何停播?  如何选择美橙互联多站合一建站方案?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  如何选择可靠的免备案建站服务器?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  如何快速搭建高效WAP手机网站吸引移动用户?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  宝塔建站教程:一键部署配置流程与SEO优化实战指南  ,在苏州找工作,上哪个网站比较好?  如何快速搭建支持数据库操作的智能建站平台?  如何通过VPS搭建网站快速盈利?  如何挑选最适合建站的高性能VPS主机?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  常州企业网站制作公司,全国继续教育网怎么登录?  如何注册花生壳免费域名并搭建个人网站?  实例解析Array和String方法  北京企业网站设计制作公司,北京铁路集团官方网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。