You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django修改用户密码后会话失效(用户匿名)的原因与解决

Django修改密码后用户变为匿名状态的原因与解决方法

问题原因

当你直接修改用户模型的password字段并调用save()时,Django会触发内置的安全机制——自动使该用户的所有现有会话失效,目的是防止密码变更后旧会话仍能被非法使用。你的代码里直接给user.password赋值哈希后的密码并保存,恰好触发了这个会话清空逻辑,所以当前用户会立刻变成匿名状态。

解决方法

要解决这个问题,需要用Django提供的标准方法处理密码修改和会话更新,步骤如下:

  • 不要直接赋值password字段:改用user.set_password(new_psswd)方法设置新密码,这个方法会正确生成密码哈希,且不会直接触发会话失效。
  • 更新当前会话的认证哈希:保存用户后,调用update_session_auth_hash(request, user)函数,它会同步更新当前会话的认证信息,确保用户密码变更后仍保持登录状态。

修改后的视图函数代码:

from django.contrib.auth import update_session_auth_hash, check_password
from django.contrib import messages

def psswdReset(request):
    if request.method == 'POST':
        new_psswd = request.POST.get('new_psswd')
        psswd = request.POST.get('psswd')
        password_is_correct = check_password(psswd, request.user.password)
        if password_is_correct:            
            user = CustomUser.objects.get(id=request.user.id)
            # 使用set_password处理密码
            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',{}) 

另外你代码里return语句后的print永远不会执行,可以直接删除。

内容的提问来源于stack exchange,提问作者Jinoy KS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:42:18