我的团队几年前已经覆盖了用户的身份验证方法,以便针对LDAP而不是djangos模型后端进行身份验证。
此方法查看用户的LDAP。如果用户存在正确的用户名和密码,则会获取或创建用户(这意味着用户不必作为Django数据库中的模型对象存在,以便有人登录)。
该方法将新创建的密码保留为None。然后设置所有其他信息。
我注意到他们在验证用户后,如果用户有效,则调用用户的set_unusable_password。在评论中,他们写道它覆盖了Django的内置密码处理......这显然是有道理的。但我不知道他们为什么需要,因为我们已经覆盖了身份验证方法。
我通过删除set_unusable_password测试了这一点,以便密码保留为None并且验证有效。他们仍然可以使用存储在LDAP上的密码登录。您仍然无法将模型中的密码覆盖为与LDAP上的密码不同,并使用该密码登录。
所以基本上set_unusable_password调用除了创建一个密码之外没有任何效果......无论如何都没有使用它。
我唯一能想到的是它可能是旧版Django中的问题的解决方案(我们现在在1.11中)。
在源代码和文档中花了很多时间后,我无法弄清楚为什么需要它。
为什么会那样?写它的人已经离开了,所以我没有解释为什么他们这样做。如果我删除它,是否会有任何不必要的副作用?
答案 0 :(得分:4)
如果您将密码设置为None
,您的代码可能会有效,但最好使用set_unusable_password
。
密码不可用的用户are not allowed to request a password reset。如果您启用了ModelBackend
和LDAP后端,则password=None
的用户可以重置其密码,然后使用模型后端登录。