返回首頁
當前位置: 主頁 > 網絡編程 > .Net實例教程 >

高級權限管理系統的設計程序代碼

時間:2010-06-04 23:22來源:知行網www.aotfjk.live 編輯:麥田守望者

核心提示:在任何系統中,權限設計是最基礎的東西,一個好的權限系統,可以為開發人員提高開發進度;而且,又可以為用戶提供完美的可擴展權限管理,而非簡單的權限定制。本文實現功能:實現基于角色+模塊+權限粒度的權限管理相關概念:(1)角色:是一類功能的集合,比如新聞編輯這個角色,他可能有起草新聞、編輯新聞等功能集合,...
在任何系統中,權限設計是最基礎的東西,一個好的權限系統,可以為開發人員提高開發進度;而且,又可以為用戶提供完美的可擴展權限管理,而非簡單的權限定制。
本文實現功能:實現基于角色+模塊+權限粒度的權限管理
相關概念:
(1)角色:是一類功能的集合,比如新聞編輯這個角色,他可能有起草新聞、編輯新聞等功能集合,而責任編輯他可能就有更多的權限,比如除了新聞編輯的功能,還有審核新聞、刪除新聞等粒度級別操作;這個可以理解為程序設計中的組.
(2)權限粒度:它是最小的單位,比如起草新聞、編輯新聞、審核新聞、刪除新聞等
(3)用戶:就是一個系統的最終使用用戶(包括管理人員和被管理人員)
(4)資源:管理的對象


下面模擬對一個信息系統的控制數據:

 

 

(圖一. 權限示意圖)


用戶信息表: UserID
UserName

U1
張三

U2
李四
 


角色表: RoleID
RoleName

R1
新聞編輯

R2
責任編輯
 


角色用戶表: RoleID
UserID

R1
U1

R2
U2
 

 

權限粒度表:
PrivilegeID
ResourceType
PrivilegeTitle

P1
NTA
起草新聞:分類A

P2
NTA
編輯新聞:分類A

P3
NTA
審核新聞:分類A

P4
NTA
刪除新聞:分類A

P1
NTB
起草新聞:分類B

P2
NTB
編輯新聞:分類B

P3
NTB
審核新聞:分類B

P4
NTB
刪除新聞:分類B
 


注意:這個表里面添加有資源(模塊)信息

 

角色權限表: RoleID
PrivilegeID

R1
P1

R1
P2

R2
P1

R2
P2

R2
P3

R2
P4
 


判斷一個用戶具有某個模塊權限實現:
#獲取權限(Privileges)的語句:
Select PrivilegeID + `,` + ResourceType From 角色權限表 Where RoleID In (Select RoleID From 用戶角色表 Where UserID='U1')

#權限的判斷
Privileges.Contain('F1,NTA');

 


在新添加一個分類的時候,同時也在權限表中增加相應的記錄(當然不是在數據庫里面直接添加,由和權限相關的函數來添加)。
使用這種解決方案可以簡單地對有分類的應用(比如論壇系統)的每個分類實行不同的控制(比如VIP板塊,就只能擁有VIP角色的用戶才能瀏覽、發表等,而其他板塊只要是注冊用戶就可以使用了)。

 

在實際應用中PrivilegeID并不是隨便的一個字符串,而是進行了編碼,其編碼中包含了模塊ID以及能夠體現出父子關系,舉個例子來說:對于論壇系統,我們給它一個模塊ID為”30”,論壇的權限我們先分成2類,一類是管理類(比如刪除帖子),一類是使用類(比如發帖、回帖、瀏覽帖子等),給管理類一個編碼:01,使用類一個編碼:02,我們就對PrivilegeID進行如下的編碼:
300101:刪除帖子
300201:發帖
300202:回帖
300203:瀏覽帖子

對于資源(比如某個板塊1,板塊的ID為:01),我們可以組合出如下的Privileges(當然這個組合你也可以不用逗號分隔,用其他的組合方式也可以,不過不要產生歧義):
300101,01:板塊1刪除帖子的功能
300201,01:板塊1發帖的功能
……
對于RoleID也是采用的編碼方式,也能體現角色的父子關系,也可以實現角色功能的繼承等(當然獲取角色功能列表的SQL語句就不是現在這么簡單了)。在我現在的應用里面沒有實現角色的繼承(雖然角色的編碼體現出了角色的父子關系)。
 

------分隔線----------------------------
標簽(Tag):C# SQLServer2005 Access ASP.NET
------分隔線----------------------------
推薦內容
猜你感興趣
湖南刘雪龙黑彩