摘要: 本文講的是通用權限管理設計篇_設計模式, 博客地址:http://www.blogjava.net/amigoxie/ 一.引言 因為做過的一些系統的權限管理的功能雖然在逐步完善,但總有些不盡人意的地方,總想抽個時間來更好的思考一
博客地址:http://www.blogjava.net/amigoxie/
一.引言
因為做過的一些系統的權限管理的功能雖然在逐步完善,但總有些不盡人意的地方,總想抽個時間來更好的思考一下權限系統的設計。
權限系統一直以來是我們應用系統不可缺少的一個部分,若每個應用系統都重新對系統的權限進行設計,以滿足不同系統用戶的需求,將會浪費我們不少寶貴時間,所以花時間來設計一個相對通用的權限系統是很有意義的。
二.設計目標
設計一個靈活、通用、方便的權限管理系統。
在這個系統中,我們需要對系統的所有資源進行權限控制,那么系統中的資源包括哪些呢。我們可以把這些資源簡單概括為靜態資源(功能操作、數據列)和動態資源(數據),也分別稱為對象資源和數據資源,后者是我們在系統設計與實現中的叫法。
系統的目標就是對應用系統的所有對象資源和數據資源進行權限控制,比如應用系統的功能菜單、各個界面的按鈕、數據顯示的列以及各種行級數據進行權限的操控。
三.相關對象及其關系
大概理清了一下權限系統的相關概念,如下所示:
1. 權限
系統的所有權限信息。權限具有上下級關系,是一個樹狀的結構。下面來看一個例子
系統管理
用戶管理
查看用戶
新增用戶
修改用戶
刪除用戶
對於上面的每個權限,又存在兩種情況,一個是只是可訪問,另一種是可授權,例如對於“查看用戶”這個權限,如果用戶只被授予“可訪問”,那么他就不能將他所具有的這個權限分配給其他人。
2. 用戶
應用系統的具體操作者,用戶可以自己擁有權限信息,可以歸屬於0~n個角色,可屬於0~n個組。他的權限集是自身具有的權限、所屬的各角色具有的權限、所屬的各組具有的權限的合集。它與權限、角色、組之間的關系都是n對n的關系。
3. 角色
為了對許多擁有相似權限的用戶進行分類管理,定義了角色的概念,例如系統管理員、管理員、用戶、訪客等角色。角色具有上下級關系,可以形成樹狀視圖,父級角色的權限是自身及它的所有子角色的權限的綜合。父級角色的用戶、父級角色的組同理可推。
4. 組
為了更好地管理用戶,對用戶進行分組歸類,簡稱為用戶分組。組也具有上下級關系,可以形成樹狀視圖。在實際情況中,我們知道,組也可以具有自己的角色信息、權限信息。這讓我想到我們的QQ用戶群,一個群可以有多個用戶,一個用戶也可以加入多個群。每個群具有自己的權限信息。例如查看群共享。QQ群也可以具有自己的角色信息,例如普通群、高級群等。
針對上面提出的四種類型的對象,讓我們通過圖來看看他們之間的關系。

有上圖中可以看出,這四者的關系很復雜,而實際的情況比這個圖還要復雜,權限、角色、組都具有上下級關系,權限管理是應用系統中比較棘手的問題,要設計一個通用的權限管理系統,工作量也着實不小。
當然對於有些項目,權限問題並不是那么復雜。有的只需要牽涉到權限和用戶兩種類型的對象,只需要給用戶分配權限即可。
在另一些情況中,引入了角色對象,例如基於角色的權限系統, 只需要給角色分配權限,用戶都隸屬於角色,不需要單獨為用戶分配角色信息。
理清了對象關系之后,讓我們接着來進行數據庫的設計。在數據庫建模時,對於N對N的關系,一般需要加入一個關聯表來表示關聯的兩者的關系。初步估計一下,本系統至少需要十張表,分別為:權限表、用戶表、角色表、組表、用戶權限關聯表、用戶角色關聯表、角色權限關聯表、組權限關聯表、組角色關聯表、用戶屬組關聯表。當然還可能引出一些相關的表。下面讓我們在PowerDesigner中畫出各表吧。
各表及其關系如下:

1. 用戶表

2. 角色表

3. 權限表

4. 組表

5. 角色權限表

6. 組權限表

7. 組角色表

8. 用戶權限表

9. 用戶角色表

10. 用戶組表

11. 組織表

12. 操作日志表

1. 引言 1.1 編寫目的
本文檔對通用權限管理系統的總體設計、接口設計、界面總體設計、數據結構設計、系統出錯處理設計以及系統安全數據進行了說明。 1.2 背景
a、 軟件系統的名稱:通用權限管理系統;
b、 任務提出者、開發者:謝星星;
c、 在J2EE的web系統中需要使用權限管理的系統。 1.3 術語
本系統:通用權限管理系統;
SSH:英文全稱是Secure Shell。 1.4 預期讀者與閱讀建議
1.5 參考資料
《通用權限管理系統需求規格說明書》
《通用權限管理系統數據庫設計說明書》 2. 總體設計 2.1 設計目標
權限系統一直以來是我們應用系統不可缺少的一個部分,若每個應用系統都重新對系統的權限進行設計,以滿足不同系統用戶的需求,將會浪費我們不少寶貴時間,所以花時間來設計一個相對通用的權限系統是很有意義的。
本系統的設計目標是對應用系統的所有資源進行權限控制,比如應用系統的功能菜單、各個界面的按鈕控件等進行權限的操控。 2.2 運行環境
操作系統:Windows系統操作系統和Linux系列操作系統。 2.3 網絡結構
通用權限管理系統可采用Java Swing實現,可以在桌面應用和Web應用系統中進行調用。如果需要要適應所有開發語言,可以將其API發布到WEB Service上。暫時用Java Swing實現。 2.4 總體設計思路和處理流程
在說明總體設計思路前,我們先說明本系統的相關概念:
1. 權限資源
系統的所有權限信息。權限具有上下級關系,是一個樹狀的結構。下面來看一個例子
系統管理
用戶管理
查看用戶
新增用戶
修改用戶
刪除用戶
對於上面的每個權限,又存在兩種情況,一個是只是可訪問,另一種是可授權,例如對於“查看用戶”這個權限,如果用戶只被授予“可訪問”,那么他就不能將他所具有的這個權限分配給其他人。
2. 用戶
應用系統的具體操作者,用戶可以自己擁有權限信息,可以歸屬於0~n個角色,可屬於0~n個組。他的權限集是自身具有的權限、所屬的各角色具有的權限、所屬的各組具有的權限的合集。它與權限、角色、組之間的關系都是n對n的關系。
3. 角色
為了對許多擁有相似權限的用戶進行分類管理,定義了角色的概念,例如系統管理員、管理員、用戶、訪客等角色。角色具有上下級關系,可以形成樹狀視圖,父級角色的權限是自身及它的所有子角色的權限的綜合。父級角色的用戶、父級角色的組同理可推。
4. 組
為了更好地管理用戶,對用戶進行分組歸類,簡稱為用戶分組。組也具有上下級關系,可以形成樹狀視圖。在實際情況中,我們知道,組也可以具有自己的角色信息、權限信息。這讓我想到我們的QQ用戶群,一個群可以有多個用戶,一個用戶也可以加入多個群。每個群具有自己的權限信息。例如查看群共享。QQ群也可以具有自己的角色信息,例如普通群、高級群等。
針對如上提出的四種對象,我們可以整理得出它們之間的關系圖,如下所示:
總體設計思路是將系統分為組權限管理、角色權限管理、用戶權限管理、組織管理和操作日志管理五部分。
其中組權限管理包括包含用戶、所屬角色、組權限資源和組總權限資源四部分,某個組的權限信息可用公式表示:組權限 = 所屬角色的權限合集 + 組自身的權限。
角色權限管理包括包含用戶、包含組和角色權限三部分,某個角色的權限的計算公式為:角色權限 = 角色自身權限。
用戶權限管理包括所屬角色、所屬組、用戶權限、用戶總權限資源和組織管理五部分。某個用戶總的權限信息存在如下計算公式:用戶權限 = 所屬角色權限合集 + 所屬組權限合集 + 用戶自身權限。
組織管理即對用戶所屬的組織進行管理,組織以樹形結構展示,組織管理具有組織的增、刪、改、查功能。
操作日志管理用於管理本系統的操作日志。
注意:因為組和角色都具有上下級關系,所以下級的組或角色的權限只能在自己的直屬上級的權限中選擇,下級的組或者角色的總的權限都不能大於直屬上級的總權限。 2.5 模塊結構設計
本系統的具有的功能模塊結構如下圖所示: 
2.6 尚未解決的問題
無。 3. 接口設計(暫略) 3.1 用戶接口(暫略) 3.2 外部接口(暫略) 3.3 內部接口(暫略) 4. 界面總體設計
本節將闡述用戶界面的實現,在此之前對頁面元素做如下約定:
4.1 組權限管理 
當用戶選擇“修改”按鈕時,彈出用戶列表,操作人可以通過勾選或取消勾選來修改該組所包含的用戶。

當用戶選擇“修改”按鈕時,彈出角色樹形結構,操作人可以通過勾選或取消勾選來修改該組所屬的角色。


通過對已具有的權限取消勾選,或為某權限添加勾選,來修改組的權限信息,點擊“保存”按鈕保存修改信息。
4.1.5組管理 在下圖中,選中組 1 的時候,右鍵點擊可彈出組的操作列表,包括添加、刪除和修改按鈕,從而完成在該組下添加子組,刪除該組以及修改該組的功能。

4.2 角色權限管理 4.2.1包含用戶

當用戶選擇“修改”按鈕時,彈出用戶列表,操作人可以通過勾選或取消勾選來修改該角色所包含的用戶。
4.2.2包含組 
當用戶選擇“修改”按鈕時,彈出用戶列表,操作人可以通過勾選或取消勾選來修改該角色所包含的組。
4.2.3角色權限 
通過對已具有的權限取消勾選,或為某權限添加勾選,來修改角色的權限信息,點擊“保存”按鈕保存修改信息。 4.2.4管理角色
在下圖中,選中組1的時候,右鍵點擊可彈出組的操作列表,包括添加、刪除和修改按鈕,從而完成在該組下添加子組,刪除該組以及修改該組的功能。 
4.3 用戶權限管理 4.3.1所屬角色 
當用戶選擇“修改”按鈕時,彈出角色樹形結構,操作人可以通過勾選或取消勾選來修改該用戶所屬的角色。 4.3.2所屬組
當用戶選擇“修改”按鈕時,彈出組的樹形結構,操作人可以通過勾選或取消勾選來修改該用戶所屬的組。 4.3.3用戶權限
通過對已具有的權限取消勾選,或為某權限添加勾選,來修改用戶的權限信息,點擊“保存”按鈕保存修改信息。 4.3.4總權限
通過對已具有的權限取消勾選,或為某權限添加勾選,來修改用戶的權限信息,點擊“保存”按鈕保存修改信息。 4.3.5用戶管理
當選擇了某用戶時,點擊右鍵,彈出菜單列表:修改、刪除、取消,點擊修改和刪除按鈕可以實現用戶的刪除和修改功能。
選擇某個組織,例如下表中的“廣州分公司”,彈出菜單列表:添加子組織、刪除組織、修改組織、添加用戶、取消,點擊添加用戶按鈕可以實現用戶的添加功能。 
4.3.6組織管理
選擇某個組織,例如下表中的“廣州分公司”,彈出菜單列表:添加子組織、刪除組織、修改組織、添加用戶、取消,點擊添加子組織、刪除組織、修改組織按鈕可以實現組織的添加、刪除和修改功能。
4.4 操作日志管理 4.4.1查詢操作日志
操作名稱:|________| 操作人:|________|
操作時間從 |________| 到 |________| [查詢] [重置] [刪除]
編號 操作名稱 操作內容 操作人 操作時間
1 xx1 -- Amigo 2007-10-8
2 xx2 -- xxyy 2007-10-8
…
輸入上圖表單中的查詢信息后,點擊“查詢”按鈕,可查詢出符合條件的信息。 4.4.2刪除操作日志
操作名稱:|________| 操作人:|________|
操作時間從 |________| 到 |________| [查詢] [重置] [刪除]
編號 操作名稱 操作內容 操作人 操作時間
1 xx1 -- Amigo 2007-10-8
2 xx2 -- xxyy 2007-10-8
…
輸入上圖表單中的查詢信息后,點擊“查詢”按鈕,可查詢出符合條件的信息。而后點擊“刪除”按鈕,可刪除符合查詢條件的操作日志。
