2013-03-27 30 views
2

我正在設計授權服務。它根據分配給用戶的角色和在內容上設置的權限執行訪問控制。用戶可以屬於多個組。這些組也可以屬於其他組。羣體下的羣體深度並不那麼大。內容可以在用戶級別或組級別共享。內容也可以與多個組共享。內容允許的操作是to-readto-read-write設計審查 - 基於角色的訪問系統的性能和可伸縮性問題

這是我對設計解決上述問題的想法。事情是,它看起來很簡單。 我很擔心我錯過了一些會傷害設計性能或可伸縮性的點。這是設計。

數據存儲: 每個用戶可以有多個角色。角色是一個字符串,看起來像名稱空間。 supergroup.group.subgroup.rolename。 每個內容可以有多個權限。權限是一個字符串,看起來像操作類型前綴的名稱空間。 canreadwrite.supergroup.group.subgroup.rolename

授權算法 則授權功能的算法是這樣的(PS這只是顯示的基礎知識,在實踐中的角色和權限陣列進行排序和某種形式的二進制搜索將被用來做這種匹配)

public bool CanReadWrite(string[] roles, string[] permissions) 
{ 
    foreach (var role in roles) 
    { 
     foreach (var permission in permissions.Where(s => s.StartsWith(canreadwrite))) 
     { 
      string barePermission = permission.Remove(0, canreadwrite.Length); 

      if (role.StartsWith(barePermission)) 
      { 
       return true; 
      } 
     } 
    } 

    return false; 
} 

您是否發現此設計有任何問題?任何性能問題?可伸縮性問題?

回答

2

您的應用程序並不十分清晰,特別是這些用戶組的層次結構與角色/權限設計有何關係。

首先,我會避免自己實現二進制搜索,但只是使用dictionaries

第二我假設你可能有大量的內容項目和大量的用戶。看起來您可能會爲每個內容項目添加大量「虛線的權限字符串」,但爲了性能和權限的可維護性,您應該將每個內容的角色/權限項目數量保持較小。

也許您可以從這些用戶組層次結構中拆分角色定義/維護,即內容項只能「知道」某些角色,而不是這些組。第三,如果你確實需要用戶組的層次結構,我會考慮允許在更高級別的組上附加角色/權限,以避免需要在最低級別上定義/維護角色/權限(假設多個組織可能的低級別組)。

s.a. RBAC at wikipedia

+0

第二個擔心是沒有提到真正關注「組的深度一組依據組下是沒有那麼大」。我知道1st和RBAC。第三是我正在努力解決的事情。 – Ankush 2013-04-09 07:53:12

+0

字典和散列表對於這樣的分層樹是一個糟糕的選擇。 – 2013-04-09 10:14:42

+0

(第二關注:)即使沒有深度,你可能會結束很多團體 - 被附加到潛在的許多內容項目(與糟糕的設計)。 – thoku 2013-04-09 10:17:28

0

我找不到任何真正的問題,除了兩個相當奇怪的頂級組叫canreadwritecanread。如果一個愚蠢的殺人者創建這樣的團體,你的算法就會失敗。

因此,我建議使用類似canreadwrite:supergroup.group.subgroup.rolename的東西。

作爲一種替代方法,您可以格式化像rolehierarcy:permission這樣的關聯,使用StartsWith(roleName)測試角色並使用EndsWith(":" + permissionName)來驗證權限。

supergroup.group.subgroup.rolename:canreadwrite

相關問題