Django 1.11身份验证set_unusable_password vs设置密码为无

时间:2018-05-16 15:31:50

标签: python django ldap django-authentication

我的团队几年前已经覆盖了用户的身份验证方法,以便针对LDAP而不是djangos模型后端进行身份验证。

此方法查看用户的LDAP。如果用户存在正确的用户名和密码,则会获取或创建用户(这意味着用户不必作为Django数据库中的模型对象存在,以便有人登录)。

该方法将新创建的密码保留为None。然后设置所有其他信息。

我注意到他们在验证用户后,如果用户有效,则调用用户的set_unusable_password。在评论中,他们写道它覆盖了Django的内置密码处理......这显然是有道理的。但我不知道他们为什么需要,因为我们已经覆盖了身份验证方法。

我通过删除set_unusable_password测试了这一点,以便密码保留为None并且验证有效。他们仍然可以使用存储在LDAP上的密码登录。您仍然无法将模型中的密码覆盖为与LDAP上的密码不同,并使用该密码登录。

所以基本上set_unusable_password调用除了创建一个密码之外没有任何效果......无论如何都没有使用它。

我唯一能想到的是它可能是旧版Django中的问题的解决方案(我们现在在1.11中)。

在源代码和文档中花了很多时间后,我无法弄清楚为什么需要它。

为什么会那样?写它的人已经离开了,所以我没有解释为什么他们这样做。如果我删除它,是否会有任何不必要的副作用?

1 个答案:

答案 0 :(得分:4)

如果您将密码设置为None,您的代码可能会有效,但最好使用set_unusable_password

密码不可用的用户are not allowed to request a password reset。如果您启用了ModelBackend和LDAP后端,则password=None的用户可以重置其密码,然后使用模型后端登录。