我正在設計授權服務。它根據分配給用戶的角色和在內容上設置的權限執行訪問控制。用戶可以屬於多個組。這些組也可以屬於其他組。羣體下的羣體深度並不那麼大。內容可以在用戶級別或組級別共享。內容也可以與多個組共享。內容允許的操作是to-read
或to-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;
}
您是否發現此設計有任何問題?任何性能問題?可伸縮性問題?
第二個擔心是沒有提到真正關注「組的深度一組依據組下是沒有那麼大」。我知道1st和RBAC。第三是我正在努力解決的事情。 – Ankush 2013-04-09 07:53:12
字典和散列表對於這樣的分層樹是一個糟糕的選擇。 – 2013-04-09 10:14:42
(第二關注:)即使沒有深度,你可能會結束很多團體 - 被附加到潛在的許多內容項目(與糟糕的設計)。 – thoku 2013-04-09 10:17:28