我正在使用NHibernate编写一个3层应用程序,其中帐户密码在数据库中保存为哈希。
表示层调用一个save方法,该方法需要一个帐户实体,在我的服务中,在将密码提供给存储库之前对其进行哈希处理。
因此,第一次保存帐户时,密码会被正确哈希,一切都很好。
但是,一旦我必须更新帐户,而不更改密码,帐户实体中的密码属性的值已经过哈希处理,当它通过我的服务的save方法传递时,它将再次进行哈希处理。 / p>
我的实体看起来像这样:
public class AccountEntity : EntityBase {
public virtual string Username { get; set; }
public virtual string Password { get; set; }
public virtual string Email { get; set; }
public virtual bool Enabled { get; set; }
}
我的服务使用save方法:
public class AccountService {
private readonly IRepository<AccountEntity> _accountRepository;
private readonly IHashingProvider _hashingProvider;
public AccountService(IRepository<AccountEntity> accountRepository, IHashingProvider hashingProvider) {
_accountRepository = accountRepository;
_hashingProvider = hashingProvider;
}
public void Save(AccountEntity accountEntity) {
accountEntity.Password = _hashingProvider.Hash(accountEntity.Password);
_accountRepository.Save(accountEntity);
}
}
如何告诉NHibernate不更新密码?我还有其他什么可能性?
答案 0 :(得分:2)
我建议以不涉及NHibernate层的方式解决这个问题。只需将“首次创建”操作(需要散列)与“一般保存任何更新”操作(不需要散列)分开。
例如,向您的AccountService添加Create()
方法,以便第一次创建帐户,该方法可以执行散列并委派给Save()
。然后,通用Save()
可以正常持久保存对象。
您还可以添加一种持久更改密码的方法,该方法可以通过哈希运行新请求的密码并调用Save()
。
答案 1 :(得分:1)
您可以使用会话拦截器并使用OnSave函数重新设置原始值的属性值