为什么Django的用户模型将电子邮件字段设置为非唯一?

Orc*_*rca 5 python security django django-models

我使用Django的默认用户模型,电子邮件不是唯一的,现在我有多个用户使用相同的电子邮件地址.

您可以将User_A的电子邮件地址设置为user_a@example.com,然后新用户User_B可以使用相同的电子邮件地址user_a@example.com进行注册.

这在任何编程领域都没有意义,它会导致电子邮件发送功能混淆,并可能导致错误的密码重置(如果发送密码重置链接,两个用户共享相同的电子邮件地址).

这并不像我看到的那样存在明显的安全漏洞,因为只有原始用户才能控制原始电子邮件地址,因此攻击者不会收到重置的电子邮件.

但是,这可能导致原始用户User_A被锁定在其原始帐户之外(如果他忘记了密码)并且因为Django尝试仅重置新用户User_B而无法发出密码重置.显然User_A想要访问他的帐户,而不是User_B的帐户.

  1. 理由是什么?
  2. 显然,密码重置功能与电子邮件相关联,因此如果我根据电子邮件重置密码,哪个用户(在按照密码重置链接后)将被重置?
  3. 如何使电子邮件字段与众不同?

Tho*_*zco 5

密码重置功能确实基于电子邮件地址.

它会向所有拥有相应电子邮件的帐户发送重置电子邮件.

传递给电子邮件模板的上下文包括user,因此您的电子邮件重置消息可能包含用户名,以便用户识别将重置的密码.


所有这些都可以通过使用以下方式覆盖:

  • 自定义密码重置表单
  • 自定义用户模型


Set*_*eth 0

django.contrib.auth 使用用户名字段来标识用户,而不是电子邮件地址,因此如果两个用户具有相同的电子邮件地址,则不会发生冲突。

此外,由于不需要电子邮件地址,因此它在数据库中为空或为空(这两种情况都不能形成良好的唯一键)。

对于您的另一个问题 - 密码重置将重置请求它的用户的密码,因为它是按用户名请求的。

拥有两个具有相同地址的帐户会非常方便。例如,也许一个是管理员帐户,另一个是普通用户。