在django中使用标准身份验证模块时,用户身份验证失败是含糊不清的。换句话说,似乎没有办法区分以下两种情况:
1.用户名有效,密码无效 2.用户名无效
我想显示适当的消息给用户在这两种情况下,而不是单一的“用户名或密码无效...”。
有没有人有简单的方法来做到这一点。问题的核心似乎直接涉及到最低层 - 在django.contrib.auth.backends.ModelBackend类中。这个类的authenticate()方法,它将用户名和密码作为参数,如果身份验证成功,就返回User对象,如果身份验证失败,则返回None。鉴于这段代码处于最低层(好吧,是高于数据库代码的最低层),绕过它似乎会丢失很多代码。
最好的方法是实现一个新的身份验证后端并将其添加到AUTHENTICATION_BACKENDS设置中吗?可以实现一个后端,它返回一个(User,Bool)元组,其中User对象仅在用户名不存在时为None,Bool仅在密码正确时为True。然而,这将打破后端与django.contrib.auth.authenticate()方法的约定(文档记录了成功身份验证时返回User对象,否则返回None)。
也许,这只是担心过头了?无论用户名或密码是否不正确,用户可能都必须前往“丢失密码”页面,因此这可能只是学术上的问题。但我无法阻止自己感到...
编辑:
关于我选择的答案的评论: 我选择的答案是实现此功能的方法。还有另一个答案,下面讨论了这样做的潜在安全影响,我也考虑过它作为被提名的答案。然而,我提名的答案解释了如何实现此功能。基于安全性的答案讨论了是否应该实现此功能,这实际上是一个不同的问题。
1.用户名有效,密码无效 2.用户名无效
我想显示适当的消息给用户在这两种情况下,而不是单一的“用户名或密码无效...”。
有没有人有简单的方法来做到这一点。问题的核心似乎直接涉及到最低层 - 在django.contrib.auth.backends.ModelBackend类中。这个类的authenticate()方法,它将用户名和密码作为参数,如果身份验证成功,就返回User对象,如果身份验证失败,则返回None。鉴于这段代码处于最低层(好吧,是高于数据库代码的最低层),绕过它似乎会丢失很多代码。
最好的方法是实现一个新的身份验证后端并将其添加到AUTHENTICATION_BACKENDS设置中吗?可以实现一个后端,它返回一个(User,Bool)元组,其中User对象仅在用户名不存在时为None,Bool仅在密码正确时为True。然而,这将打破后端与django.contrib.auth.authenticate()方法的约定(文档记录了成功身份验证时返回User对象,否则返回None)。
也许,这只是担心过头了?无论用户名或密码是否不正确,用户可能都必须前往“丢失密码”页面,因此这可能只是学术上的问题。但我无法阻止自己感到...
编辑:
关于我选择的答案的评论: 我选择的答案是实现此功能的方法。还有另一个答案,下面讨论了这样做的潜在安全影响,我也考虑过它作为被提名的答案。然而,我提名的答案解释了如何实现此功能。基于安全性的答案讨论了是否应该实现此功能,这实际上是一个不同的问题。