我正在创建一个REST服务,它提供标准操作,例如按用户获取用户,添加用户,删除用户,列出用户等。我正在为此项目使用Google Cloud Endpoints。
我当前的模型使用从User
派生的名为DisplayableUser
的类。 User
包含密码等敏感信息,而DisplayableUser
仅包含可安全传递给客户端的字段。每当我需要为用户提供JSON表示时,我只需将User
转换为DisplayableUser
,然后将其序列化并传递给客户端。
我的问题是,这是正确的方法吗?我在此之前试过的尝试失败的方法是:
引入一个名为Password
的单独类。此类包含对User
(现在不包含任何敏感数据)和实际哈希密码的引用。我正在使用objectify与数据存储BTW进行交互。
@Entity
public class Password
{
@Id
Long id;
@Load
Ref<User> user;
String passwordHash;
.....
}
我从数据存储中检索User
后面临的问题,如何检索相应的Password
实体?
答案 0 :(得分:1)
解决方案1 而不是使用referenceProperty,为什么不让密码成为用户的孩子?这样,一旦你有了你的用户,你可以轻松地检索密码,比如
p = Password.query(Password.ancestorKey == user_ID).fetch()
这有助于使您的查询保持一致。当您查询密码时用户将被锁定的事实不应该是一个问题(当然,取决于您的使用情况)。
解决方案2 另一种解决方案是使用&#34;哈希密码&#34;创建密码。和&#34; user_id&#34;作为参数。
解决方案3 我个人会转储可显示的用户并只使用用户。当您查询&#34; safe&#34;信息,只需使用projection query即可查看您想要的字段
答案 1 :(得分:1)
每当数据模型与数据传输(或显示)模型不匹配时,都需要创建单独的类。在简单的情况下,在客户端共享数据模型类可能很方便,但只要您开始通过扭曲来获取正确的数据,就可以更轻松地制作DTO。使用projectlombok.org摆脱样板,DTO变得超轻量级。