【问题标题】:Django: How to destroy user session after a password reset/change?Django:如何在密码重置/更改后销毁用户会话?
【发布时间】:2012-03-19 10:23:12
【问题描述】:

我最近在我的 django 项目中实现了一个简单的更改密码视图。问题是出于安全原因应该销毁旧会话。在不要求用户再次登录的情况下执行此操作的最佳方法是什么。

我想我可以注销/登录他/她,像这样:

from django.contrib.auth import login as auth_login
from django.contrib.auth import logout as auth_logout

@login_required
def change_password(request):
  # My stuff
  request.user.set_password(new_password)
  request.user.save()
  # I need this:
  logout(request)
  login(request,request.user)

但我认为这不是最好的主意。你怎么看?

还有其他方法吗?

我错过了什么吗? (我的意思是,这样安全吗)

【问题讨论】:

    标签: django session authentication


    【解决方案1】:

    django 会在注销时清除会话,所以你会没事的:

    https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.logout

    当您调用 logout() 时,当前请求的会话数据将被完全清除。所有现有数据都将被删除。这是为了防止其他人使用相同的 Web 浏览器登录并访问之前用户的会话数据。

    【讨论】:

    • 我不想注销我的用户。
    【解决方案2】:

    我不明白这些强制重置会话的安全原因是什么。但是,方法是:

    @login_required
    def change_password(request):
      request.user.set_password(new_password)
      request.user.save()
      username = request.user.username
      logout(request)
      user = authenticate(username=username, password=new_password) #<-- here!!
      if user is not None:
          login(request,user)
      else:
          #raise your exception
    

    您应该在登录前进行身份验证。引用文档:

    首先调用 authenticate() 当您手动登录用户时, 您必须在调用 login() 之前调用 authenticate()。认证() 在用户上设置一个属性,注意哪个身份验证后端 成功验证了该用户(请参阅后端文档 有关详细信息),稍后登录时需要此信息 过程。

    【讨论】:

    • 假设你觉得你的密码被“偷”了。您现在在家用 PC 中,因此您可以更改密码。但是,如果您在工作 PC 上初始化了会话会发生什么?该会话仍然存在,因此您需要将其杀死。这就是安全原因。
    • Santiago,hasta donde yo conozco,删除当前会话不要关闭所有其他站点用户会话。
    【解决方案3】:

    看看这个应用程序https://github.com/atugushev/django-password-session。 此包在更改密码后使所有会话(当前会话除外)失效。

    这个特性也终于在 Django 1.7 中实现了。见:https://docs.djangoproject.com/en/dev/topics/auth/default/#session-invalidation-on-password-change

    【讨论】:

      【解决方案4】:

      我刚刚发现这现在是 Django 的一个内置功能,从 1.7 开始就有了:

      https://docs.djangoproject.com/en/1.7/topics/auth/default/#session-invalidation-on-password-change

      基本上,现在所有会话都包含用户密码的哈希值,因此如果用户更改密码,所有现有会话都会自动失效。

      所以,对您的问题的简短回答是:升级 django。

      此更改的一个可能不良副作用是,默认情况下,用户在更改密码后最终不得不重新登录。因此,您可能实际上希望 当前 用户会话保持登录状态。请参阅已链接的文档,Django 的密码更改内置视图会默认为您执行此操作,或者您可以手动调用名为 @ 的函数987654322@

      【讨论】:

        猜你喜欢
        • 2016-05-17
        • 2018-09-04
        • 1970-01-01
        • 2015-08-29
        • 1970-01-01
        • 2021-03-29
        • 1970-01-01
        • 2020-05-13
        • 2021-01-28
        相关资源
        最近更新 更多