.Net平臺下基於角色的訪問控制系統(轉)
RBAC是目前公認的解決大型企業的統一資源訪問控制的有效方法。其顯著的兩大特徵是:一是減小授權管理的複雜性,降低管理開銷;二是靈活地支援企業的安全策略,並對企業的變化有很大的伸縮性。
資源是應用系統中被管理、控制的物件,資源是許可權管理的最小單位,資源的抽象要結合實際的需要確定粒度大小。
許可權是對具體資源的訪問許可。許可權和資源密不可分,在這裡,許可權可以用一個二元組來表示(R,A),其中,R表示資源,A表示訪問方式。
角色是指一個組織或任務中的工作或位置,它代表了一種資格、權利和責任。
使用者就是一個可以獨立訪問應用系統中的資源的主體。使用者在一般情況下是指應用系的使用者。
RBAC中只對角色分配資源的訪問許可權,從另一個角度說,角色是許可權的某種組合。使用者可以具有一個或多個角色,但不能直接對使用者分配許可權。角色的許可權相對穩定,而使用者容易變化,RBAC通過角色實現使用者與許可權的分離,增加了許可權分配和管理的方便性和靈活性。
以上是RBAC的基本概念,下面結合Windows .Net Framework平臺,給出一套簡潔、實用的RBAC許可權管理系統的設計方案。
2 .Net Framework新特性的應用[2]
2.1 型別(Type)資訊
Type位於.Type實際上是一個抽象基類,它有與每一種資料型別相對應的派生類。通過執行時獲取Type派生類的例項,可能獲取相應資料型別的所有資訊。
2.2 自定義屬性(Attribute)
傳統程式語言如 C++,都提供了關鍵字(如 public 、private等)。這些關鍵字提供有關類成員的附加資訊,還通過描述類成員對其他類的可訪問性來進一步定義類成員的行為。由於編譯器被顯式設計為識別預定義關鍵字,程式設計者無法建立自己的關鍵字。
但在.Net Framework中,公共語言執行庫CLR(Common Language Library )允許程式設計者新增類似關鍵字的描述性宣告(稱為屬性)來批註程式設計元素,如型別、欄位、方法和屬性等。
程式設計者可以宣告從 System.Attribute 派生的自定義屬性類,用來儲存特定的描述資訊。
3 通用RBAC許可權管理系統的設計
各個通常的應用軟體系統中,除了需進行安全訪問控制的資源各不相同外,其它如使用者及角色的管理,角色的許可權分配等基本相同,如果能對不同應用系統的資源抽象出相同的描述和訪問介面,自然就能實現一套通用的許可權管理系統。
3.1 設計目標與主要功能
系統的基本設計目標是,通過統一定義的應用系統資源樹介面定義,實現應用系統無關的通用RBAC管理系統,如圖1所示,應用系統通過統一定義的資源及其訪問方式介面與許可權管理系統平臺進行互動。
本系統主要有以下功能:
Ø 使用者管理:使用者的編輯、角色分配及使用者認證等;
Ø 角色管理:角色的編輯、許可權分配等;
Ø 資源及許可權管理:應用系統資源及訪問方式以及許可權的定義等;
Ø 安全訪問控制:判別登入使用者是否具備對特定資源的訪問許可權。
資源介面 |
許可權管理系統 |
許可權 分配 |
角色 分配 |
角色管理 |
使用者管理 |
資源與許可權管理 |
應用系統 |
圖1 許可權管理平臺體系結構
3.2 應用系統的資源
資源是對應用系統中要進行安全訪問控制的物件的抽象。依據應用物件類別的不同,資源也相應分為不同的資源類。
3.2.1 資源的唯一標示
本系統設計採用64位的資源ID(ResourceID)來唯一標示系統的一個資源物件。應用系統需自定義一套完整的資源ID編碼規則,對要安全訪問控制的每一個物件,根據編碼規則可得出一個資源ID。資源ID推薦採用分層設計,如可分為三個層次:應用模組ID-物件類別ID-物件ID。
由於可由應用系統物件得到相應的資源ID,本系統的資料庫中不再需要單獨建立資源與應用系統物件的對映表,這是本系統設計的一個創新之處。
3.2.2 資源的訪問方式
使用者對系統的不同資源通常有特定的訪問方式,如對檔案的訪問方式有“讀”、“寫”、“執行”等。這裡將對資源訪問方式設計為可以按位組合的列舉量([FlagsAttribute]標示),基本資料型別為32位整數,即對一種資源總共可表示32種不同的訪問方式。每個列舉值還帶有自定義的屬性(Attributes)。以下是檔案的訪問方式列舉量定義的示例程式碼(C#):
[FlagsAttribute]
public Enum File_AccessMode
{
[DisNameAttribute(“讀”)]
Read = 0x01,
[DisNameAttribute(“寫”)]
Write = 0x02,
[DisNameAttribute(“執行”)]
Execute,
}
由於訪問方式可以按位組合,組合訪問方式的表示被大大簡化。如對檔案的“讀”與“寫”的組合訪問方式可以簡記為:
File_AccessMode m=
File_AccessMode.Read | File_AccessMode.Write;
自定義屬性“DisNameAttribute”給出列舉值的顯示名稱,示例定義參見下面的程式碼(C#):
[AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
public class DisNameAttribute : Attribute
{
public DisNameAttribute(string name)
{
this.name = name;
}
private string name;
public string Name
{
get { return name; }
}
}
不同應用系統需在程式碼中自定義各自系統內所有資源類別的訪問方式列舉型別,本系統的資料庫同樣不需定義和儲存各類資源訪問方式表,這是本系統簡化設計的核心。
3.2.3 資源及其訪問方式介面
為了統一對各個不同應用系統資源的訪問,本系統採用分層組織的樹形結構來描述應用系統的資源,UML類檢視如圖2所示。
圖2 應用系統資源及訪問方式介面定義
其中類ResourceTree為資源樹,代表應用系統所有資源的集合,它包含ResourceNode的連結串列Nodes; 類ResourceNode是資源樹的節點,代表一個具體的資源,ResourceNode同樣可包含多個ResourceNode,ResourceNode的屬性ID返回相應資源的ResourceID。
由於資源訪問方式列舉量的定義各不相同,如何以統一的介面方式獲取不同資源的訪問方式是本平臺設計的一個難點。這裡採用屬性AccessType統一返回資源訪問方式列舉量的型別(Type)物件。通過下列程式碼可以得到訪問方式列舉量的所有資訊(C#):
Type t =resourceNode.AccessModeType;
FieldInfo[] fs=t.GetFields(BindingFlags.DeclaredOnly|
Binding Flags.Static|BindingFlags.Public);
int[] enumVals =new int[fs.Length];
string[] enumNames= new string[fs.Length];
int i =0;
foreach(FieldInfo f in fs)
{
enumVals[i]=f.GetValue(null);
DisNameAttribute[] ds=f.GetCustomAttribute(typeof(DisNameAttribute),false);
If(ds.Length != 0)
enumNames[I]=ds[0].Name;
}
上述程式碼中,enumVals陣列中儲存了所有訪問方式的列舉值,enumNames資料組中儲存了各個訪問方式的顯示用名稱。
3.3 訪問許可權
許可權是指使用者對具體資源的訪問許可,許可權和資源密不可分。這裡許可權用一個二元組來表示:
Permission(Resource,AccessMode)
其中Resource表示一個具體資源,AccessMode是使用者對此資源的所授權的訪問方式。需注意的是,由於AccessMode設計成可按位組合,所以此二元組表示了使用者對一個資源的所有訪問許可權。
3.4 角色
角色可由系統管理員或授權使用者靈活定製。角色具有唯一且不重用的ID。
3.4.1 角色的組織
角色之間採用組合關係,一個角色可以包含其它多個角色,一個角色的許可權是它本身及其所包含的其它角色所擁有的許可權的集合。
3.4.2 角色表
Role_Table
欄位 |
型別 |
描述 |
ID |
int |
主鍵 |
Name |
string |
名稱 |
Status |
int |
狀態 |
… |
… |
… |
角色的所有相關資訊均記錄到資料庫中的角色表Role_Table。
3.5 角色的許可權分配
許可權分配是指為角色配置某種許可權。可以用三元組(Role,Resource,AccessMode)表示,即Role角色對Resource資源可以進行AccessMode的操作。
3.5.1 角色許可權關聯表
RolePermission_Table
欄位 |
型別 |
描述 |
RoleID |
int |
外來鍵 |
ResourceID |
Int64 |
外來鍵 |
AccessMode |
int |
訪問方式 |
… |
… |
… |
角色的所有授權資訊均儲存到角色許可權關聯表RolePerssion_Table。
3.6 使用者
使用者可由系統管理員或授權使用者靈活增刪。使用者具有唯一且不重用的ID。
3.6.1 使用者的組織
各個使用者相互獨立,不存在繼承或組合關係。
3.6.2 使用者表
User_Table
欄位 |
型別 |
描述 |
ID |
int |
主鍵 |
Name |
string |
名稱 |
Password |
string |
加密口令 |
Status |
int |
狀態 |
… |
… |
… |
使用者的所有相關資訊均記錄到資料庫中的使用者表User_Table。
3.7 使用者的角色委派
角色委派是指為使用者分配若干種角色。可以用二元組(User,Role)表示,含義是User使用者屬於角色Role。一個使用者可以屬於多個角色。
3.7.1 使用者角色關聯表
UserRole_Table
欄位 |
型別 |
描述 |
Role_ID |
int |
外來鍵 |
User_ID |
int |
外來鍵 |
Status |
int |
狀態 |
… |
… |
… |
使用者與角色的所有關聯資訊均記錄到資料庫的使用者角色關聯表UserRole_Table。
4 系統執行模型
4.1 使用者認證
使用應用系統的使用者首先要進行使用者登入,登入成功後,結合UserRole_Table及RolePerssion_Table查詢當前使用者對所有資源的訪問許可權,根據返回結果在動態生成此使用者對資源的所有許可權表:
UserPermission_Table
欄位 |
型別 |
描述 |
ResourceID |
int64 |
資源 |
AccessMode |
int |
訪問方式 |
… |
… |
… |
其中AccessMode的值是使用者所屬的多個角色對某一資源的所有訪問方式的組合。
4.2 安全訪問控制
當用戶要對一個需安全訪問控制的物件操作時,首先根據應用系統自定義的資源ID編碼規則及訪問物件的相關資訊生成ResourceID,和應用系統定義的對此物件進行操作所需的訪問許可權accessMode,再查詢UserPermission_Table表,判別當前使用者是否具有相應的操作許可權。
5 結論
本文結合.Net Framework開發平臺提供的新特性,給出了一套基於RBAC通用的普通應用系統許可權管理的設計方案,本設計結構簡潔、實用,並有較高的靈活性,滿足普通應用系統對安全訪問控制的需要。