前言
權限系統可以說是各系統最基本的部分,在領域知識裏也最容易讓人理解,所以在研究模型時,就從這裏開始。我先從達人Ayende那下載了 Rhino.Security來研究,在搞清楚來龍去脈後,再配合RBAC模型,甚至是MDA中的PartyRelationship也就比較清楚。
RBAC
先讓我們搞清楚什麼是RBAC,基本的概念圖如下。意思是不論是Subject(個人)或Orgaization(組織),都必須透過Role去取得 Permission所定義的Operation。Session還不明瞭其用意。整個圖的最複雜的,就是Role Hierarchy。子代角色可以繼承父代的權限,然後一人可以多種角色。
Rhino.Security先來看一半的ER Model。UsersGroups就是Role,伴隨著自身關聯構成Role Hierarchy。UsersGroupsHierarchy則是設計考量,畢竟從單一Table取出整顆Tree的所有結點是很不好做。Users透 過UsersToUsersGroups找到扮演的角色,從而知道關聯的權限與操作。應該是基於實際應用的考量,因為Ayende允許User也可以沒有 角色就有權限。至於Allow是指是否可以操作,Level是指兩種以上的角色對某一權限的操作衝突時,何為優先。

再來看另一半的ERModel,這裏是在定義可以操作的物件群組。例如Opereation定義/Employee/Edit這種操作,但它是作用在 Employee這種EntityTypes之上。更進一步,可以分類EntityTypes成EntitiesGroups。 EntitiesGroups還可以有Hierarchy的觀念,例如Employee與它的屬性。
EntityReference與EntityTypes之間,需要一個EntitySecurityKey區隔開,原因我還不太明瞭。 EntityReferencesToEntitiesGroups則是建立物件的群組關係。然後與之前相同 的,EntityGroupsHierarchy是協助產生EntitiesGroups的樹狀結構。Permission不僅能設定 EntitiesGroups,也能單對EntityReference。

API
Rhino Security做了個有趣的API讓我們使用,以一種近乎人類語言的方式封裝了權限的操作
permissionsBuilderService
.Allow("/Employee/Edit") //允許什麼樣的操作
.For("Secretary") //什麼角色,經理
.On("Employee") //作用在什麼物件群組
.DefaultLevel() //優先級最低
.Save();
authorizationService.IsAllowed(secretary_A,employee_A,"/Employee/Edit"); //true