2012-05-09 102 views
0

我在Java,Spring,Struts2和Hibernate中使用多租戶SaaS Web應用程序。經過一些研究,我選擇在共享數據庫,共享模式,共享表方法中實現多租戶。並用tenantId標記每個db-line。確保多租戶SaaS應用程序的安全

我已經重寫了我的應用程序,因此經理和Dao會將tenantId作爲參數來僅提供正確的db資源。

這對於獲取信息時的所有視圖都非常適用。也用於創建新的東西(使用登錄用戶tenantId來存儲信息)。

但是,更新和刪除的東西,我不知道如何保護我的應用程序。 例如:當用戶想要編輯一個對象時,URL將爲:/edit?objectId=x 並將其映射到將通過Id檢索此對象的操作。意思是任何登錄的用戶都可以通過url-modification查看任何對象。 這可以通過將tenantId添加到Dao來解決,因此如果用戶嘗試查看他租賃範圍之外的對象,他將得不到任何東西。

好吧,那好吧,但關於何時發送編輯表單? 如果用戶修改請求,則會隱藏隱藏字段objectId,以便操作將收到請求以更改不屬於用戶租期的對象。

或者,如果用戶的URL,修改刪除操作/delete?objectId=x

Basicly我需要確保登錄的用戶可以訪問到任何他想要做的一些方法。爲了所有得到它的容易。把tenantId放在where子句中。 但是,對於更新和刪除,我不知道要走什麼方向。

我可以查詢數據庫的每個更新和刪除,看看用戶是否有權訪問該對象,但我試圖保持數據庫交互到最低限度。所以我覺得爲每一個這樣的動作做一個額外的數據庫調用是不切實際的。

有沒有人有任何提示或提示我的問題?

回答

0

閱讀方面的內容同樣適用於書寫/更新:用戶只能看到/訪問/更改他們自己的內容。你的問題更多的是關於其他任何數據庫。您應用於查看數據的相同約束條件也必須適用於寫入數據。

在這種情況下,您不希望先磨損查詢的性能,然後再更新。這很好,因爲您可以使用條件更新數據庫。由於這可能是數據庫級別,因此您需要知道數據庫的功能(一次完成)。例如,oracle有合併語句。