一尘不染

不使用密码手动登录用户

django

我希望你能帮助我找到无需使用密码即可实现手动(服务器端启动)手动登录的最佳方法。让我解释一下工作流程:

  • 用户注册
  • 谢谢!带有激活链接的电子邮件已发送blablabla
  • (帐户现已存在,但被标记为未启用)
  • 用户打开电子邮件,单击链接
  • (已启用帐户)
  • 谢谢!你现在可以使用该网站
    我要做的是在用户单击电子邮件链接后登录,以便他可以立即开始使用该网站。

我无法使用他的密码,因为该密码已在数据库中加密,这是编写自定义身份验证后端的唯一选择吗?


阅读 570

收藏
2020-04-03

共1个答案

一尘不染

你不需要密码即可登录用户。该auth.login功能仅需要一个User对象,在启用帐户后,你大概已经从数据库中获取了该对象。因此,你可以将其直接传递给login

当然,你需要非常小心,用户无法欺骗到现有已启用帐户的链接,然后该链接将以该用户身份自动登录。

from django.contrib.auth import login

def activate_account(request, hash):
    account = get_account_from_hash(hash)
    if not account.is_active:
        account.activate()
        account.save()
        user = account.user
        login(request, user)

…等

编辑:

嗯,authenticate因为它增加了额外的属性,所以没有注意到要使用的要求。查看代码,它所做的只是一个backend等同于身份验证后端模块路径的属性。因此,你可以伪造它-在上面的登录调用之前,执行以下操作:

user.backend = 'django.contrib.auth.backends.ModelBackend'
2020-04-03