本文實現功能:實現基於角色+模塊+權限粒度的權限管理
相關概念:
(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:瀏覽帖子
300101,01:板塊1刪除帖子的功能
300201,01:板塊1發帖的功能
……
對於RoleID也是採用的編碼方式,也能體現角色的父子關係,也可以實現角色功能的繼承等(當然獲取角色功能列表的SQL語句就不是現在這麼簡單了)。在我現在的應用裡面沒有實現角色的繼承(雖然角色的編碼體現出了角色的父子關係)。
另一種 資料格式:
Permission:權限表
User:用戶表
UserPermissions:用戶權限表
Group:組表
GroupPermissions:組權限表
UserGroups:用戶組表
沒有留言:
張貼留言