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
相关产品推荐
相关产品推荐

