【问题标题】:Django password_reset Form email validationDjango password_reset 表单电子邮件验证
【发布时间】:2019-03-27 14:10:16
【问题描述】:

Django password_reset 表单不检查电子邮件是否存在。还验证表单提供的任何电子邮件地址。

问题是,我如何使用自定义表单检查不存在的电子邮件并抛出错误?

顺便说一句,我在here 找到了以下解决方案,但它对我不起作用。 (使用 Django 2.1)。如果这应该工作,我找不到我缺少的东西。

forms.py

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

urls.py

path('sifre-sifirla/', PasswordResetView.as_view(), {'password_reset_form':EmailValidationOnForgotPassword}, name='password_reset'),

提前谢谢你。

编辑:

对于其他用户的信息,问题由@Alasdair 回答并工作,但@pypypy 的观点也很重要。

urls.py的变化如下:

path('sifre-sifirla/', PasswordResetView.as_view(form_class=EmailValidationOnForgotPassword), name='password_reset'),

【问题讨论】:

  • 一般来说,您不希望在电子邮件不存在的情况下显示错误,因为这可以用作用户枚举安全漏洞。
  • 是的,你是对的!因此,在 password_reset_done.html 上添加一些信息,例如“如果您没有收到电子邮件,您将输入另一个电子邮件地址”将解决问题。顺便说一句,我想知道将来使用的解决方案。不管怎样,谢谢你。 @pypypy
  • 对于PasswordResetView,属性是form_class,而不是password_reset_form。我会删除字典并将其作为参数传递给as_view()path('sifre-sifirla/', PasswordResetView.as_view(form_class=EmailValidationOnForgotPassword), name='password_reset'),
  • @Alasdair ,感谢您的回复,现在正在运行。但 pypypy 的观点对我来说也很重要。现在我知道该怎么做。再次感谢。
  • 是的,您要考虑是否可以接受透露帐户存在。但请记住,您可能已经在其他地方公开了它。例如,您的注册页面可能会显示错误“使用该电子邮件的帐户已存在”。

标签: django validation email


【解决方案1】:

用来自@Alasdair 的部分内容总结上述讨论

#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('sifre-sifirla/', PasswordResetView.as_view(form_class=EmailValidationOnForgotPassword), name='password_reset'),

@pypypy 说这种方法可以用来获取用户名是正确的。 减少此问题的一种方法是在用户尝试 3 个不同的电子邮件后立即回复 429 Too Many Requests。这可以使用例如django-ratelimit

来实现

【讨论】:

  • 感谢分享答案:)
猜你喜欢
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多