Django - 使用电子邮件域并且没有密码的auth用户

时间:2010-08-27 10:50:31

标签: django security authentication

我要求更改电子邮件和密码的标准Django登录,以允许任何用户无需密码登录,但仅限于他们在某个域上...例如somebody@example.com ...允许用户进入正确的域名。

有什么建议吗?

3 个答案:

答案 0 :(得分:5)

假设“在正确的域名上”意味着他们拥有相关域的电子邮件地址,您可以写一个custom authentication backend

  • 查看是否有用户使用该电子邮件地址(且不超过一个),这也意味着更新注册流程以确保电子邮件地址保证唯一,并可能检查您的数据库已经重复,以防万一)
  • 获取该用户并拆分其电子邮件地址的域名,以根据列表/允许的无密码所需域名进行检查
  • 从您的自定义身份验证后端返回用户,就好像已经满足正常的密码检查一样,即使从未使用check_password()检查过。 Django文档和各种djangosnippets.org片段显示了如何执行此操作。

另外:

  • 您将不得不为管理员登录视图使用新的/重写的身份验证表单类,该类不需要密码字段(但仍然显示非特殊登录),因此如果有,则不会抱怨没有输入密码。

最后:

  • 得到宗教,如果你还没有它
  • 向你的G / god祈祷,没有其他人知道允许使用电子邮件地址进行无密码身份验证的网站,尤其是他们也没有获得电子邮件地址的信息。问题,特别是如果您的网站持有关于第三方的任何个人数据或必须符合PCI-DSS等等。
  • 强烈考虑向您的客户/用户/经理/任何人提出“否”,因为上面的原因。使用密码是有原因的。

或者,最后,最后:

  • 跳过上述所有内容,并告诉您的客户/用户/经理一些不同的密码存储工具 - 例如thisthis

答案 1 :(得分:1)

如果您的用户使用电子邮件somebody@example.com打开了openid,那么您可以使用OpenId解决方案(例如Django-openid;还有其他人)来验证他的身份并允许他访问。

如果这不太可能,那么您需要找到一种自定义方式来确保用户是他声称的用户。

答案 2 :(得分:0)

不知怎的这样:

if cleaned_data['email'].endswith('@example.com'):
    user = None
    try:
        user = User.objects.get(email = cleaned_data['email'])
    except:
        pass
    if user:
        login(request, user)

您的概念允许每个人在不使用密码的情况下知道或猜测其中一个受影响的电子邮件地址!

祝你好运!