2010-05-15 113 views
4

目前,我們正在一個角色設計一個用戶角色和權限系統在我們的Web應用程序(ASP.NET),它似乎是我們有幾個案件不適合在經典基於角色的訪問控制(RBAC)。我會發布幾個問題,每個問題都專注於一個特定的案例。這是我的第二個問題(第一個問題在這裏:Non RBAC User Roles and Permissions System: checking the user's City)。非RBAC用戶角色和權限系統:與性能

我們有以下情況:我們需要在我們的Web應用程序中實施經理角色。但是,經理可以屬於一個或多個公司(在我們正在爲其創建此Web應用程序的一大組公司內)。說,可以有「公司A和B的經理」,「公司C的經理」等。

根據經理所屬的公司,他有訪問某些操作:例如,他可以只與他所屬公司的客戶溝通。也就是說,「公司A和公司B的經理」只能與公司A和公司B的客戶進行聯繫,而不能與公司C的客戶進行聯繫。他還可以查看公司A和B的客戶詳細信息頁,而不是C等。

看來這種情況屬於RBAC。但是,情況並非如此。我們需要創建一個ManagerRole類,將有一個公司財產 - 也就是說,這會不會只是一個作爲權限(如在古典RBAC)的集合作用,但隨着性能一個作用!

這只是具有屬性的角色的一個示例。還會有其他的:例如,一個管理員角色,這也將屬於一些公司,也將具有其他自定義屬性。

這意味着我們將層級或角色類:


class Role – base class 
class ManagerRole : Role 
    List Companies 
class AdministratorRole : Role 
    List Companies 
    Other properties 

我們研究了純RBAC及其在幾個系統實施,並沒有發現系統設有層級或角色,每個都具有自定義屬性。在RBAC中,角色只是權限的集合。

我們可以使用權限對屬性(如ManagerPermission,AdministratorPermission)進行建模,但這有很多缺點,主要是我們無法分配角色,如「公司A和B的經理「,但必須創建一個包含A公司和B公司的ManagerPermission的角色......此外,」經理「似乎更像是一個」角色「(在公司中的職位),而不是來自語言學的觀點。

對於這個主題的任何想法以及此領域的任何經驗,都不勝感激!

謝謝。

回答

0

如果您遇到問題,可以通過爲可以實現的角色實現繼承來解決。

你的例子是另一種去基於屬性的訪問控制方式的機會(例如,允許具有管理者角色並且爲公司A工作的用戶)。儘管如此,實施RBAC系統要困難得多。

1

讓我先說你的兩個問題基本上是一樣的,應該加以鞏固。同一概念的多種變體沒有價值。

您希望爲基本角色添加額外級別的任意歧視。

要實現這種RBAC並保留利用任何內置基礎架構的優勢,您需要做出一些妥協並構建一些自定義實現。

第一步是採用角色定義約定的妥協。例如當你想確定一個用戶是否屬於'companyA'角色'經理'時,你可以定義該規則,無論是屬性,代碼還是一個站點地圖,都可以定義爲'manager-companyA',即IsUserInRole("manager-companyA")

第二步是一個自定義的RoleProvider實現,它可以解析它並適當地查詢維護層次關係的基礎數據源,爲此您必須提供自定義UI以進行維護。

您至少需要實施ASP.Net使用的方法,以確保以正確的格式檢查或輸出角色。

IsUserInRole將得到一個字符串,您將必須使用約定解析成組成部分進行驗證,如前所述。

GetRolesForUser可以在緩存cookie中的角色時調用,並且必須執行角色的層次遞歸併輸出所有排列。例如用戶是companyA和companyB的管理員,因此GetRolesForUser("user")應返回由值manager-companyAmanager-companyB組成的數組,以供使用緩存角色的asp.net基礎結構使用,並且不交互式輪詢RoleProvider。

這種類型的方法將爲您提供已建立的ASP.Net RBAC設施的最大可用性,同時爲您提供所需的定製。

所以,最後,只要你能調整你的期望和/或重新定義您的要求儘可能工作與現有基礎設施的少(少得多)的代碼,你必須實際設計,實施,測試和維護而且您必須花費更多時間專注於系統尚未建立完善基礎架構的其他方面。

+1

類似IsUserInRole(「manager-companyA」)的代碼根本不漂亮。我們希望擁有像IsUserInRole(「manager」,companiesList)這樣的代碼。此外,角色的這些屬性的數量可能很大,像「manager-companyA,companyB ...」這樣的字符串可能會變得太長。 我認爲我們可以通過自己創建我們自己的權限和角色系統,而不使用ASP.NET角色來做得更好。我真的沒有看到任何麻煩。 – 2010-05-16 11:02:41

+0

@micha - 你可能誤解了我寫的一些內容。也許審查可能會將其清除。並且設計,實施,測試和維護了幾個定製的提供商堆棧,併爲浪費的時間,金錢和睡眠感到後悔,我只能祝你好運。 – 2010-05-16 11:30:48

+0

@code詩人。我不能同意重新創造輪子的謬論。但有時輪子不適合。一本很好的書是'\t \t 專業ASP.NET 2.0安全性,成員和角色管理' 它痛苦詳細地描述每個事情如何滴答。 – ggonsalv 2010-05-20 03:30:16

0

我不確定這是否可能是您正在尋找的,但在我自己的RBAC系統信息搜索中,我認爲我可能找到了適合您需求的內容。我正在閱讀Tony Marston的一篇文章,他談到了虛擬專用數據庫/行級安全性。這些將在數據級別提供權限,這意味着您可以將用戶限制在數據庫中的某些信息子集。文章鏈接如下。

http://www.tonymarston.net/php-mysql/role-based-access-control.html(期待中的「其他類型的訪問控制」,在頁面的底部)

同樣,我不知道這是你在找什麼或沒有,但它可能是值得的快速瀏覽。

1

我目前正在努力實現我自己的RBAC庫版本(出於簡單理解RBAC的膽量,同時讓它專門爲我的代碼庫/數據庫調優)的困擾。 (注意:約束是困難的部分)!

我已經處理了(尚未完全實施)的方式是我創建了Groups,它基本上是用戶的集合。所以在這種情況下,我會創建三個組;公司A,公司B和公司C,然後將每個用戶適當地分配給這些組(公司)。

然後,您可以將管理員角色分配給特定用戶,並且還可以爲組分配角色。我喜歡這個,因爲它允許我一次向多個用戶添加一個單獨的卷(在數據庫事務期間非常快,並且一旦緩存,內存佔用就小得多)。

因此,在您的示例中,假設您的UI中顯示了一個Institution模型(或對象實例)。只需點擊它,然後選擇「安全」菜單,就會得到一個窗口,允許您添加用戶/組成員(如Windowns安全性)。通過添加(組)公司A並允許「讀取」權限,實質上允許該組內的所有用戶讀取該公司及其子對象,該對象將是客戶聯繫人和數千個其他模型實例。

這可能不是完美的,但這是迄今爲止我發現的最好的解決方案(儘管我仍然有自己的問題,我將就此問題提出一個問題)。