2011-04-21 53 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