我使用标准的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'
)
有没有更好的方法可以做到这一点?
由于password_reset_confirm
不是基于类的视图,因此您不能以任何重要方式对它进行干净的自定义,而无需借助中间件类型的技巧。因此,您目前正在做的事情似乎是最有效的方法。
如果django将被传递request
给SetPasswordForm
(类似于DRF传递request
给序列化器的方式),则您可能会覆盖表单,save()
以便在那里登录用户,但是现在还不可能。
您还可以查看将auth作为基于类的视图实现的其他第三方库。通过快速的Google搜索,最有希望的是:
auth.views
基于类的视图。您可以覆盖form_valid
以验证用户身份。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句