我正在寻找访客模式的替代方案.让我只关注模式的几个相关方面,同时跳过不重要的细节.我将使用Shape示例(抱歉!):
你阅读有关访客模式的大多数地方表明第5点几乎是模式工作的主要标准,我完全同意.如果修改了IShape派生类的数量,那么这可能是一种非常优雅的方法.
所以,问题是当添加一个新的IShape派生类时 - 每个访问者实现需要添加一个新方法来处理该类.这充其量是令人不愉快的,在最坏的情况下,这是不可能的,并且表明这种模式并非真正设计用于应对这种变化.
所以,问题是有没有人遇到过处理这种情况的替代方法?
在django中使用标准身份验证模块时,失败的用户身份验证不明确.也就是说,似乎无法区分以下两种情况:
我想我想在这两种情况下向用户显示相应的消息,而不是单个"用户名或密码无效......".
任何人都有使用简单方法的经验.问题的症结似乎是在最低级别 - 在django.contrib.auth.backends.ModelBackend类中.此类的authenticate()方法(以用户名和密码作为参数)仅在身份验证成功时返回User对象,如果身份验证失败则返回None.鉴于此代码处于最低级别(好,最低级别高于数据库代码),绕过它似乎很多代码被抛弃了.
简单地实现新的身份验证后端并将其添加到AUTHENTICATION_BACKENDS设置是最好的方法吗?可以实现返回(User,Bool)元组的后端,其中如果用户名不存在,则User对象仅为None,如果密码正确,则Bool仅为True.但是,这会破坏后端与django.contrib.auth.authenticate()方法的约定(记录为在成功验证时返回User对象,否则为None).
也许,这一切都是无所顾忌?无论用户名或密码是否不正确,用户可能无论如何都必须转到"忘记密码"页面,所以这可能都是学术性的.我只是忍不住感觉,不过......
编辑:
关于我选择的答案的评论:我选择的答案是实现此功能的方法.下面还有另一个答案,讨论了这样做的潜在安全隐患,我也将其视为提名的答案.但是,我提名的答案解释了如何实现此功能.基于安全性的答案讨论了是否应该实现这个功能,这实际上是一个不同的问题.