2013-04-17 54 views
0

我想在設計基於計數的訪問控制時得到一些建議。例如,我想限制客戶可以根據他們的賬戶在我的系統中創建的用戶數量。因此,默認情況下,客戶可以創建2個用戶,但如果升級他們的賬戶,他們可以創建5個用戶等等。 我還需要在類似的基礎上限制更多功能。設計基於計數的訪問控制

應用程序遵循通用模型,因此每個公開的功能都有一個支持表,並且我們有一個類來處理該表上的CRUD操作。該應用程序也運行在多個節點上,並具有分佈式緩存。

我正在採取的方法來實現這個如下 - 我有一個新的表,捕獲功能控制和允許的限制(存儲每個客戶)。 - 我攔截所有表的創建方法,並檢查相關表是否需要應用訪問控制。如果是這樣,我獲取創建實體的數量並與限制進行比較以決定是否允許創建。 - 我正在使用數據庫來處理併發請求時的同步。因此,創建方法被調用後,我使用更新該表下面where子句

其中(count_column + 1)=#countInMemory#

。即只有存儲在DB + 1 =內存中的值時,更新纔會成功。這將確保即使兩個線程同時嘗試創建,也只有其中一個線程能夠成功更新。成功更新的線程獲勝,另一個線程回滾。這樣我就不需要同步應用程序中的任何代碼。

我想知道是否有任何其他/更好的方式來做到這一點。我的應用程序運行在Oracle和MySQL DB上。

感謝您的幫助。

回答

0

當您回滾時,是否重試(在獲取新用戶數後)還是失敗?我推薦前者,假設新提取的用戶數將允許另一個用戶。

我最近處理了一個類似的系統,還有一些需要考慮的事情:是否希望CustomerA能夠將他們的用戶轉移到CustomerB? (這假定客戶不是獨立的,例如在我們的系統中,CustomerA可能是IT經理,CustomerB可能是同一家公司的會計經理,當CustomerA的某位員工轉移到會計賬戶時,他希望CustomerB的賬戶)。當客戶被刪除時,客戶的用戶會發生什麼? (在我們的情況下,另一位客戶/經理需要採用他們,否則他們將被刪除。)您如何將客戶的用戶限制存儲在一個單獨的表格中(例如,客戶的類型爲「Level2」,客戶類型表中說「Level2」客戶可以創建5個用戶),或者在客戶的行中(這更容易出錯,但也允許每個客戶覆蓋其最大用戶數)或組合(客戶有一個type列表示他們可以有5個用戶,而override列表示他們可以有另外3個用戶)?

但是那不在重點。你的數據庫同步很好。

+0

爲了簡化代碼,我不重試。相反,只是拋出一個異常,你的觀點雖然是一個有效的觀點。 另外,我沒有描述的情景,用戶在客戶的整個生命週期中都與客戶相關聯。 最後,我存儲每行的計數,因爲這允許我輕鬆地覆蓋限制。 – Raam