在Django中重置密码后对用户进行身份验证

马波尼

我使用标准的Django视图password_reset_confirm()来重置用户密码。用户遵循字母中的密码重置链接后,他输入新密码,然后视图将其重定向到站点根目录:

urls.py

url(r'^password-reset/confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
        'django.contrib.auth.views.password_reset_confirm', {
        'template_name': 'website/auth/password_reset_confirm.html',
        'post_reset_redirect': '/',
    }, name='password_reset_confirm'),

Django重定向用户后,该用户未通过身份验证。我不希望他再次输入密码,而是要在他设置新密码后立即对他进行身份验证。

为了实现此功能,我创建了一个委托视图。它包装标准的并处理其输出。因为标准视图仅在密码重置成功后才重定向用户,所以我检查了返回的响应状态码,如果是重定向,请再次从数据库检索用户并对其进行身份验证。

urls.py

url(r'^password-reset/confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
        views.password_reset_confirm_delegate, {
        'template_name': 'website/auth/password_reset_confirm.html',
        'post_reset_redirect': '/',
    }, name='password_reset_confirm'),

views.py

@sensitive_post_parameters()
@never_cache
def password_reset_confirm_delegate(request, **kwargs):
    response = password_reset_confirm(request, **kwargs)
    # TODO Other way?
    if response.status_code == 302:
        try:
            uid = urlsafe_base64_decode(kwargs['uidb64'])
            user = User.objects.get(pk=uid)
        except (TypeError, ValueError, OverflowError, User.DoesNotExist):
            pass
        else:
            user = authenticate(username=user.username, passwordless=True)
            login(request, user)
    return response

backends.py

class PasswordlessAuthBackend(ModelBackend):
    """Log in to Django without providing a password.

    """
    def authenticate(self, username, passwordless=False):
        if not passwordless:
            return None
        try:
            return User.objects.get(username=username)
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

settings.py

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'website.backends.PasswordlessAuthBackend'
)

有没有更好的方法可以做到这一点?

miki725

香草Django

由于password_reset_confirm不是基于类的视图,因此您不能以任何重要方式对它进行干净的自定义,而无需借助中间件类型的技巧。因此,您目前正在做的事情似乎是最有效的方法。

如果django将被传递requestSetPasswordForm(类似于DRF传递request给序列化器的方式),则您可能会覆盖表单,save()以便在那里登录用户,但是现在还不可能。

第三方套餐

您还可以查看将auth作为基于类的视图实现的其他第三方库。通过快速的Google搜索,最有希望的是:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

重置密码后的Django身份验证问题

django身份验证和密码重置

在Django中,登录后如何检测哪个auth后端对用户进行了身份验证?

使用MERN Stack进行密码重置身份验证

如何重置或更改IntelliJ进行身份验证的Git用户?

使用 ldap 进行身份验证,无需用户密码

在Android中仅使用用户名和密码通过Firestore进行身份验证

在 Cassandra 中通过用户名和密码进行身份验证

使用令牌身份验证时如何在Django通道中的Websocket连接中对用户进行身份验证

通过Azure Functions对Azure AD中的用户进行身份验证(验证用户名和密码)

加密/解密用于Django中基本身份验证的用户密码

如何通过设计身份验证令牌直接从 Active Admin 中的 edit_page 重置用户密码?

每用户SSH密码身份验证中的奇怪行为

从文件中读取密码以进行身份验证 Java

用户身份验证后删除CSS模糊影响-Django

在使用 IAP 中的“云身份验证登录”进行身份验证后,如何限制用户仅使用他的用户名(通过该用户名进行身份验证)?

Django使用登录的Windows域用户进行身份验证

Django 查询扩展用户模型进行身份验证

用户将不对Django进行身份验证

在Django的表单向导的步骤2/3中对用户进行身份验证/注册

通过在 DRF 中扩展用户模型进行身份验证(Django Rest Framework)

Laravel 5.2-通过身份验证的用户更改密码-更新后密码匹配问题

在laravel默认身份验证中触发用户验证邮件或密码重置邮件时,将密件抄送添加到邮件中

su命令以root用户身份通过passwd编辑密码后,返回无提示身份验证

使用系统密码进行身份验证

使用部分密码进行身份验证

remote:无效的用户名或密码。致命:启用两因素身份验证后,身份验证失败

remote:无效的用户名或密码。致命:启用两因素身份验证后,身份验证失败

通过Windows身份验证在Laravel中对用户进行身份验证