如何设计依赖于业务代码的 JPA 实体资源库



我有以下实体:

@Entity
public class User {
    @Id
    private Integer id;
    private String username;
    private String password;
}
要设置密码,必须提供纯文本密码

,但存储的实际密码是纯文本密码的哈希值。问题是实际的哈希计算取决于业务。更具体地说,我有以下界面和会话 Bean:

public interface PasswordHash {
    String hash(String password);
}
@Stateless
public class UserManager {
    @Inject
    private PasswordHash phash;
    public void changeUserPassword(User user, String newPassword) {
        String passwordHash = phash.hash(newPassword);
        /*Set password of 'user'*/
    }
}

有没有办法为用户实体的"密码"字段设计一个资源库,以便 UserManager 可以更改其值,但其他人无法做到这一点?如果不可能,是否有其他方法可以安全地设置密码,而无需向客户端公开 PasswordHash 接口?请注意,CDI 对实体类不可用,因此我无法将 PasswordHash 的实例直接注入其中。

处理此问题的一种方法是不要直接从服务层公开 User 实体,而只是在内部使用它来实现持久性。你通常最终要做的本质上是复制一些实体,并来回复制东西。这些"复制"类有时称为数据传输对象。有像推土机这样的工具可以使这更容易,尽管可以说不是更漂亮。

第二种方法是对抗Enterprise Java,并避免这些贫血对象。不过,迟早,您可能必须进行编程查找,因为正如您所说,实体未启用 CDI。这也不漂亮,但至少你会得到一些更面向对象的东西。

最新更新