2011-04-21 51 views
0

假设我有一个用户实体,其中包含一个由hibernate管理的id和版本,以及一个名字和一个姓氏。RESTful API隐藏休眠ID和版本

我想在具有RESTful API的User实例上进行CRUD操作,但我不希望客户端获取存储在数据库中的用户ID和版本。

我能想到的一个简单的解决方案是发送带有修改后的id和版本的用户表示,并将“public”值与数据库值映射到服务器内存中的HashMap中。我也是通过cookies,但我不认为这是一个安全的解决方案,因为它们可以被客户端黑客入侵。 AFAIK,纯粹的RESTful API不能处理服务器上的会话状态。

是否存在一种安全的,可伸缩的和RESTful的方式来发布资源而不暴露其真实ID和版本?

+0

您使用的是基于反射库来管理对象的状态? 如您所说,您如何为您的用户对象执行对setter方法的调用? “REST风格”的API在一天结束时仍然属于典型的Web MVC模式,您应该能够修改您选择的任何属性。 – hooknc 2011-04-21 21:54:37

+0

对您的要求有更好的理解会很好。到目前为止,他们没有多大意义。 – Zepplock 2011-04-22 01:07:30

回答

1

困难的一个。您需要在URI的某个地方使用id或某种表示形式来发出GET请求。

为什么你担心你的用户获得真正的ID?

您可以做的一件事是在用户的ID发送到前端之前加密用户的ID,并使用像AES这样的对称加密算法解密后端的ID。

Symmetric-key algorithm

+0

实际上没有URI的REST约定 – Zepplock 2011-04-22 00:45:24

+0

对称密钥算法似乎是能够发送加密ID并在服务器上解密的正确选择。关于并发锁定的版本,HTTP标头中的Etag可能是一个解决方案 – 2011-04-30 00:17:55

1

最好的解决办法是分离的UserEntity和userData:

@Embeddable 
class UserData { 
    String firstName; 
    String lastName; 
    ... // getters and setters 
} 

// your mapped class 
class UserEntity { 
    int id; 
    int version; 
    UserData data; 
    // getters and setters 
} 
0

如果你在“真” REST设置,则您需要提供客户端与对象的整个状态,他们将需要稍后对其执行操作。你有没有考虑过仅仅对不想让用户修改的字段应用salt和一些对称加密?通过散列会明显增加你的有效载荷大小,但是一切都会带来成本,尤其是安全性!

+1

“如果你设置的是'true'REST,那么你需要为客户提供对象的整个状态。”我严重怀疑这是真的。您可以发送您喜欢的资源状态的任何表示形式。 – 2011-04-22 00:31:09

+0

嗯,当你离开句子的其余部分时,很容易发现错误“他们需要执行一个动作..”;) – Affe 2011-04-22 05:23:36

+0

同意。我想我误解了你的意思。 – 2011-04-23 01:18:02