2009年6月2日 星期二

[php] 設計權限的需求資料表

在任何系統中,權限設計是最基礎的東西,一個好的權限系統,可以為開發人員提高開發進度;而且,又可以為用戶提供完美的可擴展權限管理,而非簡單的權限定製。
本文實現功能:實現基於角色+模塊+權限粒度的權限管理
相關概念:
(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語句就不是現在這麼簡單了)。在我現在的應用裡面沒有實現角色的繼承(雖然角色的編碼體現出了角色的父子關係)。


另一種 資料格式:
Permission:權限表
User:用戶表
UserPermissions:用戶權限表
Group:組表
GroupPermissions:組權限表
UserGroups:用戶組表

【下列文章您可能也有興趣】

沒有留言: