0

我正在努力弄清楚我应该如何覆盖 equals 并为我正在使用 NHibernate 编写的类获取哈希码。

基本业务场景是用户不能在 90 天内重复使用相同的密码。

所以我有一个“用户”,它有很多“历史密码”......用户类很简单,因为我只是在等号中使用登录名。下面是我的 HistoricalPassword 类。

public class HistoricalPassword
{
    public virtual int HistoricalPasswordId { get; set; }
    public virtual User User { get; set; }
    public virtual DateTime ChangeDate { get; set; }
    public virtual string FormerPassword { get; set; }
}

我会从商业角度说 User 和 ChangeDate 的组合会给我平等。但是......在 equals 方法中引用用户似乎不正确(因为一件事会导致延迟加载发生)......而且从我使用 HistoricalPasswordId 的 PK 阅读的内容来看,这是一个禁忌也是。

任何人都可以就如何为此覆盖 equals 提供一些建议吗?

编辑 ::: 我想我问这个问题的方式可能有点误导。对于如何执行确保密码不被重用的业务规则,我并不感到困惑……也不知道我如何知道两个密码是否相等或是否安全。我真正想知道的是与 NHibernate 相关的实体级别,我将如何覆盖该对象的 Equals,以便 NHibenate 不会在会话和/或缓存中出现欺骗。根据 NHibernate 文档(https://www.hibernate.org/hib_docs/nhibernate/html/persistent-classes.html),我应该使用业务密钥相等来覆盖equals。在这种情况下,我只是不确定在比较中使用 User 的引用对象是否是一个好主意。

4

3 回答 3

2

我不会为此覆盖 Equals - 您并没有断言这些记录是相等的,只是它们引用了相同的密码,不是吗?

当然,您只需要一个 HQL 或条件查询来为您提供过去 90 天内设置的历史密码吗?

编辑:您也可能想检查您如何存储密码。数据库中的明文密码不是一个好主意。可能是您有一个 NHibernate 用户类型,它正在将加密的密码解密为我们可以看到的字符串属性,当然......

于 2009-07-15T12:48:48.837 回答
0

有几种方法可以解决这个问题。

如果你想使用相等来做到这一点,那么将涉及到用户,特别是用户的 PK。平等将是用户 PK + 密码。日期无关紧要。然而,这可能会使事情变得过于复杂,而且我可能不会这样做。

另一种方法是仅使用密码来表示相等,因为这就是您最终要比较的内容。用户只会在查询中使用,同上更改日期。

执行 HQL 查询以获取 user = {user} 并更改日期 <(今天 - 90)的历史密码。这将返回 {user} 过去 90 天内的所有密码。解决该问题后,您需要做的就是比较密码以查看是否匹配,因为您已将结果集减少为仅 {user} 过去 90 天的密码。

最后,如上所述,只需对 {user} 执行 HQL 查询,其中 date changed < 90 和 password = {new password}。如果您得到任何结果,您就知道该密码在过去 90 天内已被使用。

最后,如上所述,这些比较都假设您正在使用明文密码或加密新密码以与旧密码进行比较。以太方式,必须做一些事情来说明密码的安全性。

于 2009-07-15T13:48:51.810 回答
0

我认为 HistoricalPassword 是一个值对象,而不是一个实体。

因此,这意味着它的“ID”将由其所有属性的值决定。

于 2009-07-15T12:50:49.557 回答