3

我有一个 User 类,它在我的 Web 应用程序中保存用于身份验证用户的电子邮件地址和密码。该用户通过 JPA / Eclipselink 映射到数据库。

我的问题是,如何防止 JPA 从数据库中加载密码字段?由于我将在我的网络应用程序中访问用户对象,因此我对将密码发送到浏览器的安全性感到不舒服。

有什么办法可以防止在 JPA / EclipseLink 中加载该字段?声明字段瞬态不是一个选项,因为当我在用户对象上调用 persist() 时,我想将它存储在数据库中。

谢谢,弗雷德麦迪逊

4

2 回答 2

2

JB Nizet 有一个有效的观点。在 Http 响应中检索和序列化它是两个独立的问题。

我不确定你用什么来序列化你的数据。如果这是一个 REST API,请考虑 Jackson 的@JsonIgnore注释或 Eclipselink MOXy 的@XmlTransient等价物。如果这使用 Java EL(facelets,jsps),您应该能够只选择感兴趣的 bean 属性。

如果您确实必须在检索期间执行此操作,请考虑 JPQL 的/Criteria API 的构造函数功能。确保对象具有接受指定参数的构造函数,并记住,如果以这种方式检索它,它将不会在持久性上下文中进行管理。

SELECT NEW my.package.User(u.id, u.name, u.etc) FROM User u

或者,考虑@PostLoad生命周期回调。

@PostLoad
private void postLoad() {
    this.password = null;
}

最后,情况可能并非如此,但我想强调密码不应该以明文形式存储的概念。我之所以提到这一点,是因为返回使用安全算法(bCrypt、多次迭代 SHA-512 等)的哈希加盐密码并不是什么大不了的事(但仍然不理想)。

于 2013-09-27T21:46:58.503 回答
0

我有类似的问题。但就我而言,我在 Entity 类中有许多 @OneToMany 关系,其中一些是 EAGER。当我查询这个实体时,它会加载所有这些,尽管对于 Web 服务我只需要其中的一些。我试过元组查询。但这不是解决方案,因为要获得所需的 OneToMany 关系,我必须加入并获取主查询的许多重复行。它使结果更加沉重,而不是经济。

于 2014-01-17T13:51:42.980 回答