小编Ste*_*teg的帖子

访客模式的替代方案?

我正在寻找访客模式的替代方案.让我只关注模式的几个相关方面,同时跳过不重要的细节.我将使用Shape示例(抱歉!):

  1. 您有一个实现IShape接口的对象层次结构
  2. 您有许多要在层次结构中的所有对象上执行的全局操作,例如Draw,WriteToXml等...
  3. 很容易直接潜入并向IShape接口添加Draw()和WriteToXml()方法.这不一定是件好事 - 每当你想添加一个要对所有形状执行的新操作时,每个IShape派生类都必须改变
  4. 为每个操作实现访问者,即Draw访问者或WirteToXml访问者在一个类中封装该操作的所有代码.然后,添加新操作就是创建一个新的访问者类,该类对所有类型的IShape执行操作
  5. 当你需要添加一个新的IShape派生类时,你基本上遇到了与3中相同的问题 - 必须更改所有访问者类以添加一个方法来处理新的IShape派生类型

你阅读有关访客模式的大多数地方表明第5点几乎是模式工作的主要标准,我完全同意.如果修改了IShape派生类的数量,那么这可能是一种非常优雅的方法.

所以,问题是当添加一个新的IShape派生类时 - 每个访问者实现需要添加一个新方法来处理该类.这充其量是令人不愉快的,在最坏的情况下,这是不可能的,并且表明这种模式并非真正设计用于应对这种变化.

所以,问题是有没有人遇到过处理这种情况的替代方法?

oop design-patterns visitor

51
推荐指数
3
解决办法
2万
查看次数

在Django身份验证期间单独验证用户名和密码

在django中使用标准身份验证模块时,失败的用户身份验证不明确.也就是说,似乎无法区分以下两种情况:

  • 用户名有效,密码无效
  • 用户名无效

我想我想在这两种情况下向用户显示相应的消息,而不是单个"用户名或密码无效......".

任何人都有使用简单方法的经验.问题的症结似乎是在最低级别 - 在django.contrib.auth.backends.ModelBackend类中.此类的authenticate()方法(以用户名和密码作为参数)仅在身份验证成功时返回User对象,如果身份验证失败则返回None.鉴于此代码处于最低级别(好,最低级别高于数据库代码),绕过它似乎很多代码被抛弃了.

简单地实现新的身份验证后端并将其添加到AUTHENTICATION_BACKENDS设置是最好的方法吗?可以实现返回(User,Bool)元组的后端,其中如果用户名不存在,则User对象仅为None,如果密码正确,则Bool仅为True.但是,这会破坏后端与django.contrib.auth.authenticate()方法的约定(记录为在成功验证时返回User对象,否则为None).

也许,这一切都是无所顾忌?无论用户名或密码是否不正确,用户可能无论如何都必须转到"忘记密码"页面,所以这可能都是学术性的.我只是忍不住感觉,不过......

编辑:

关于我选择的答案的评论:我选择的答案是实现此功能的方法.下面还有另一个答案,讨论了这样做的潜在安全隐患,我也将其视为提名的答案.但是,我提名的答案解释了如何实现此功能.基于安全性的答案讨论了是否应该实现这个功能,这实际上是一个不同的问题.

python security authentication django

5
推荐指数
2
解决办法
6125
查看次数