【问题标题】:Why does Django's User Model set the email field as non-unique? [duplicate]为什么 Django 的用户模型将电子邮件字段设置为非唯一? [复制]
【发布时间】:2013-07-07 17:15:05
【问题描述】:

我正在使用 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. 如何使电子邮件字段独一无二?

【问题讨论】:

  • 也许您希望此人拥有两个不同的帐户?
  • @Seth 不是重复的,我也在问密码重置的行为。
  • @Seth 抱歉,让两个帐户使用同一个电子邮件是没有意义的,而且我从未在任何地方看到过这种行为。
  • django pre-1.5 有一些缺点,所以他们引入了可配置的用户选项模型。现在,应该在view 或表单的clean 方法中处理创建具有重复电子邮件的用户对象。

标签: python django security django-models


【解决方案1】:

密码重置功能确实是based on email addresses

它会向all accounts that have a corresponding email发送一封重置邮件。

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


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

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

【讨论】:

    【解决方案2】:

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

    此外,由于电子邮件地址不是必需的,因此在数据库中它是空白或 null (这两者都不是好的唯一键)。

    对于您的其他问题 - 密码重置将重置请求它的用户的密码,因为它是由用户名请求的。

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

    【讨论】:

    • 管理员和普通用户? is_superuseris_staff 标志是什么?
    • 不是默认PasswordResetFormuse the email to identify the user吗?不过,我可能会遗漏一些东西。当然,这并不是说创建一个使用用户名的替代表单!
    • @Thomas - 你是对的。但是,我的意思是重置令牌不是基于电子邮件地址生成的,因此即使两个帐户具有相同的电子邮件地址,仅使用用户名的自定义密码重置表单仍然有效。
    • @karthikr - is_staff 等人,确定用户具有特殊权限(例如访问管理站点的能力)。但是,在测试站点时,我通常会创建一个没有这些权限的普通用户,以确保一切正常。基本原理类似于在 unix 系统上拥有一个 root 帐户和一个普通用户帐户。
    • @Seth 哦,我没这么理解,但这确实是一个好点!
    猜你喜欢
    • 1970-01-01
    • 2011-07-26
    • 2022-08-14
    • 2010-11-12
    • 2014-12-12
    • 2019-04-26
    • 2013-05-14
    • 2015-03-06
    • 2021-06-18
    相关资源
    最近更新 更多