我有一个用户类,其中包含我的Web应用程序中的身份验证用户的电子邮件地址和密码。该用户通过JPA / Eclipselink映射到数据库。
我的问题是,如何阻止JPA从数据库中加载密码字段?由于我将在我的网络应用程序中访问用户对象,因此将密码发送到浏览器时我对安全性感到不舒服。
有什么方法可以阻止在JPA / EclipseLink中加载字段?声明字段瞬态不是一种选择,因为当我在用户对象上调用persist()时,我想将它存储在数据库中。
谢谢, fredddmadison
答案 0 :(得分:1)
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等)的散列盐渍密码并不是那么大(但仍然不理想)。
答案 1 :(得分:0)
我有类似的问题。但在我的情况下,我在Entity类中有很多@OneToMany关系,其中一些是EAGER。当我查询此实体时,它会加载所有这些,但对于Web服务,我只需要其中一些。 我试过TupleQuery。但它不是解决方案,因为要获得所需的OneToMany关系,我必须加入并获得主查询的许多重复行。它使结果比经济更加重要。