我希望您能帮助我找出使用密码实现手动(服务器端发起)登录without的最佳方式.让我解释一下工作流程:
- 用户寄存器
- 谢谢!已向blabla发送了一封包含激活链接的邮箱
- (帐户现在存在,但标记为未启用)
- 用户打开邮箱,单击链接
- (帐户已启用)
- 谢谢!您现在可以使用该站点
我想做的是在用户点击邮箱链接后登录,这样他就可以立即开始使用网站了.
我不能使用他的密码,因为它在数据库中是加密的,唯一的 Select 是编写自定义身份验证后端吗?
我希望您能帮助我找出使用密码实现手动(服务器端发起)登录without的最佳方式.让我解释一下工作流程:
我想做的是在用户点击邮箱链接后登录,这样他就可以立即开始使用网站了.
我不能使用他的密码,因为它在数据库中是加密的,唯一的 Select 是编写自定义身份验证后端吗?
用户登录不需要密码.auth.login
function只需要一个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)
...等.
Edited:
嗯,我没有注意到使用authenticate
的要求,因为它增加了额外的属性.看看代码,它所做的只是一个backend
属性,相当于身份验证后端的模块路径.因此,你可以假装它-在上面的登录调用之前,执行以下操作:
user.backend = 'django.contrib.auth.backends.ModelBackend'