使用 Django 的密码重置通知用户电子邮件无效
Inform user that email is invalid using Django's Password Reset
我正在使用内置的 django 密码重置功能。 The documentation 状态:
If the email address provided does not exist in the system, this view won’t send an email, but the user won’t receive any error message either. This prevents information leaking to potential attackers. If you want to provide an error message in this case, you can subclass PasswordResetForm and use the password_reset_form argument.
但是,就我而言,当用户尝试使用错误的用户名重置时显示错误消息更为重要。
我知道我需要做什么,但我不知道在子类 PasswordResetForm 的表单中写什么。
子类 PasswordResetForm 的表单应该包含什么?
谢谢。
所以我终于自己弄明白了。这是我的实现:
class EmailValidationOnForgotPassword(PasswordResetForm):
def clean_email(self):
email = self.cleaned_data['email']
if not User.objects.filter(email__iexact=email, is_active=True).exists():
raise ValidationError("There is no user registered with the specified email address!")
return email
您还需要将 {'password_reset_form': EmailValidationOnForgotPassword}
添加到 urls.py
。这是一个例子:
url(r'^user/password/reset/$',
'django.contrib.auth.views.password_reset',
{'post_reset_redirect': '/user/password/reset/done/',
'html_email_template_name': 'registration/password_reset_email.html',
'password_reset_form': EmailValidationOnForgotPassword},
name="password_reset"),
对于 Django 的更高版本,例如 Django 2.1,有一个类似的 question,只是稍微修改了代码。
#forms.py
from django.contrib.auth.forms import PasswordResetForm
class EmailValidationOnForgotPassword(PasswordResetForm):
def clean_email(self):
email = self.cleaned_data['email']
if not User.objects.filter(email__iexact=email, is_active=True).exists():
msg = _("There is no user registered with the specified E-Mail address.")
self.add_error('email', msg)
return email
和
#urls.py
from accounts.forms import EmailValidationOnForgotPassword
path('accounts/password_reset/', auth_views.PasswordResetView.as_view(form_class=EmailValidationOnForgotPassword), name='password_reset'),
请注意,这可以用来获取usernames/e-mails。 减少 这个问题的一种方法是在用户尝试 3 种不同的电子邮件时立即回复 429 Too Many Requests
。这可以使用例如 django-ratelimit
来实现
我正在使用内置的 django 密码重置功能。 The documentation 状态:
If the email address provided does not exist in the system, this view won’t send an email, but the user won’t receive any error message either. This prevents information leaking to potential attackers. If you want to provide an error message in this case, you can subclass PasswordResetForm and use the password_reset_form argument.
但是,就我而言,当用户尝试使用错误的用户名重置时显示错误消息更为重要。
我知道我需要做什么,但我不知道在子类 PasswordResetForm 的表单中写什么。
子类 PasswordResetForm 的表单应该包含什么?
谢谢。
所以我终于自己弄明白了。这是我的实现:
class EmailValidationOnForgotPassword(PasswordResetForm):
def clean_email(self):
email = self.cleaned_data['email']
if not User.objects.filter(email__iexact=email, is_active=True).exists():
raise ValidationError("There is no user registered with the specified email address!")
return email
您还需要将 {'password_reset_form': EmailValidationOnForgotPassword}
添加到 urls.py
。这是一个例子:
url(r'^user/password/reset/$',
'django.contrib.auth.views.password_reset',
{'post_reset_redirect': '/user/password/reset/done/',
'html_email_template_name': 'registration/password_reset_email.html',
'password_reset_form': EmailValidationOnForgotPassword},
name="password_reset"),
对于 Django 的更高版本,例如 Django 2.1,有一个类似的 question,只是稍微修改了代码。
#forms.py
from django.contrib.auth.forms import PasswordResetForm
class EmailValidationOnForgotPassword(PasswordResetForm):
def clean_email(self):
email = self.cleaned_data['email']
if not User.objects.filter(email__iexact=email, is_active=True).exists():
msg = _("There is no user registered with the specified E-Mail address.")
self.add_error('email', msg)
return email
和
#urls.py
from accounts.forms import EmailValidationOnForgotPassword
path('accounts/password_reset/', auth_views.PasswordResetView.as_view(form_class=EmailValidationOnForgotPassword), name='password_reset'),
请注意,这可以用来获取usernames/e-mails。 减少 这个问题的一种方法是在用户尝试 3 种不同的电子邮件时立即回复 429 Too Many Requests
。这可以使用例如 django-ratelimit