摘要:設計了一種面向用戶的菜單權限的設置方法,建立了所需的權限表,給出了面向用戶的菜單權限的授予和收回方法、菜單權限的檢查方法的算法描述。在設計和實現過程中,利用動態生成、獲取和設置菜單屬性的方法,實現用戶菜單權限的分配;利用動態獲取遞推返回條件的遞歸調用方法進行權限的檢查,從而使該方法具有良好的復用性,并且使菜單權限的授予和收回均非常方便。
關鍵詞:面向用戶; 菜單權限; 復用; 設置
中圖法分類號:TP311.5文獻標志碼:A
文章編號:1001-3695(2008)04-1108-03
在軟件系統中,進行操作權限的控制一直是一個關系到系統和數據安全性的重要環節,因為非法用戶進入和越權操作均會給系統造成損害,甚至還可能造成嚴重后果。因此,在對系統用戶分配權限或對系統進行某種操作時,特別是在進行永久性改動時,系統應該采取嚴格的授權方法和檢查手段,對用戶的身份和操作權限進行驗證,實現對資源的有效控制,禁止對數據的無權訪問,以確保系統和數據庫的安全[1]。
在權限控制中,比較常用的方法是1996 年提出的基于角色的訪問控制技術(role-based access control,RBAC)[1]。其核心思想是將訪問權限轉換為角色的權限,通過給用戶分配不同的角色,達到賦予用戶不同權限的目的。角色相當于一個權限集,是根據企業內部不同的崗位職責而設置的。隨著現代企業的發展,人員調整和機構變動越來越頻繁,職工的權責分工也越來越明確和細化,即使是屬于同一個崗位的人員,其職責權限亦很可能不同。此時,如果仍然沿用以前那種按角色來分配權限,系統將無法適應不同企業的需求,靈活性也會大大降低,而且為角色分配權限和為用戶分配角色變得非常困難。因此,必須尋找新的能夠復用的有效適應應用需要的權限管理方法。
1系統權限的控制
在數據庫管理系統中,提供了身份認證、系統權限、數據庫操作權限等嚴格的分級權限控制。在應用系統中,
一般是通過登錄時對用戶的單位、工號、密碼、機器號等屬性的確認進行軟件級的權限控制。這實際上是用戶進行系統操作的最后一道屏障,因此也是權限控制的最后一道門檻。
在登錄成功后,用戶的操作權限仍然會受到限制。按照基于角色的訪問控制方法,首先將登錄用戶分成若干操作組,每一操作組分配不同的菜單操作權限,同一組的用戶不加區分地擁有相同的權限,權限控制的最小粒度為操作組[2~4]。這種操作方式可以滿足權限控制的局部需要,但無法滿足同組不同用戶的不同操作權限的需要,因此使權限控制的靈活性大大降低。為了解決這個問題,本文將控制的最小粒度細化,允許對每一個用戶進行操作權限的控制,形成了一種面向用戶的權限控制方法。
在通過菜單進行用戶權限控制時,文獻[3,5]提出了動態的權限控制方法,但僅限于本系統使用,仍然沒有實現權限控制模塊的通用性。本文充分考慮了權限控制模塊的軟件復用性,提出了具有復用功能的面向用戶的菜單權限控制方法。
對權限的控制包括功能權限(用戶能否使用某種功能)和數據編輯權限(包括對數據的添加、刪除、更新、瀏覽等);通過菜單進行操作權限的控制包括權限的分配(包括授予、設置和收回等過程)和檢查。面向用戶可復用的系統菜單權限的設置就是要實現對每一個用戶的功能權限和數據編輯權限的分配和檢查。
2面向用戶的可復用系統菜單權限的設置
2.1面向用戶的系統菜單權限的設置方法
在權限管理模塊的設計中,應該包括以下內容:
a)在數據庫中建立工作點表,以控制用戶的工作位置。
b)建立用戶表,存儲用戶工號、密碼、用戶等級、所屬工作點等信息,并對密碼進行加密。在用戶登錄時校驗工作點、工號的合法性、密碼的正確性,從而確定是否允許用戶登錄。新建用戶默認為最低操作權限。
c)建立用戶權限表,存儲用戶的菜單級的操作權限,包括用戶工號、菜單標志等,保證任何用戶的權限均可以自由設置。
d)只有高于規定等級的用戶才有可能進行權限的授予和收回;也只有該類用戶有權授權其他用戶進行權限的分配。
e)權限的分配方式應該直觀、簡單、易操作。
f)如果上級菜單權限被限制,那么下級菜單和工具條(如果有的話)應該自動被限制。
g)在用戶登錄時,根據用戶的工號從權限表中提取用戶的操作權限,并對后臺進行權限的設置,被禁止的菜單隱藏,顯示的菜單即為允許該用戶進行的操作。不同用戶在系統中可能會看到不同的菜單。
h)菜單權限的分配和設置應該不依賴于某一個具體的應用。在進行權限分配和設置時,只需要對權限管理模塊傳遞一個菜單對象,即可完成對權限管理的功能。菜單樹的生成、用戶菜單權限的設置都應該是動態的,依賴于傳遞的入口菜單對象,從而保證權限管理模塊的復用性。
2.2權限表設計
根據上述設計思想,設計了兩個與權限管理相關的數據庫表,如表1所示。
為了保證系統權限設置的復用性,菜單對象是在系統登錄時根據用戶權限表(satff_limit)中提供的菜單名(menu_name)動態獲取的,所以不再建立菜單表。
2.3菜單權限管理的權限授予
2.3.1新建用戶的權限授予
首先定義一個最低權限集P:{p1,p2,…,pi,…,pl},pi為第i (1≤i≤l,l為系統權限中最低權限的個數)個權限;P∈Q,Q:{q1,q2,…,qj,…,qk},Q為系統權限的全集,qj為第j(1≤j≤k,l≤k,k為系統中權限的個數)個權限。最低權限集可以由用戶進行配置,不同的應用系統的最低權限集可能不同。
對于新建用戶,為了保證新建用戶能夠正常進入系統,在用戶表(staff)中新增用戶時,將最低權限集授予任何新建用戶,即利用觸發器或其他方法在新增用戶時自動向用戶權限表(satff_limit)中增加該用戶的最低權限。
2.3.2普通用戶的權限授予
利用圖1所示的權限授予界面,在用戶菜單樹中,授權用戶可以清晰、直觀地看到被授權用戶已經擁有的權限和尚未獲得的權限,通過勾選即可完成權限的授予。
2.3.3權限授予算法
S1:if 新建用戶 then 將用戶權限表(satff_limit)中staff_id =‘0’的數據插入用戶權限表satff_limitelse 轉S2。
S2:獲得用戶工號gs_staffid。
S3:for i=1 to 主菜單數。
S4:調用函數get_menu(MenuName)獲得當前窗口菜單MenuName的所有子菜單,生成菜單樹。每一個主菜單對應一個在tab中自動生成的tabpage頁。
S5:從用戶權限表(satff_limit)中檢索menu_name =MenuName,staff_id =gs_staffid,item_name=MenuItemName的enabled數據。
S6:if enabled=1 then 菜單樹中MenuItemName菜單條選中
Else菜單樹中MenuItemName菜單條不選。
S7:if i≤主菜單數then轉S3 else轉S8。
S8:if 授予權限then 從用戶權限表(satff_limit)中刪除staff_id =gs_staffid的所有數據,遍歷菜單樹,將選中的菜單條MenuItemName插入用戶權限表(satff_limit),并設置enabled=1。
2.4菜單權限管理的權限收回
2.4.1普通用戶的權限收回
利用圖1所示的權限收回界面,在用戶菜單樹中,授權用戶可以方便地收回被授權用戶已經擁有的部分或全部權限,包括最低權限集P。
圖1權限授予和收回界面
2.4.2刪除用戶的權限收回
當用戶被刪除時,該用戶的權限應該立即收回。在用戶表(staff)中刪除用戶時,利用觸發器或其他方法在用戶權限表(satff_limit)中將屬于該用戶(staff_id)的內容全部刪除,即完成該用戶權限的收回。
2.4.3權限收回算法
S1:獲得用戶工號gs_staffid。
S2:if 刪除用戶 then 從用戶權限表(satff_limit)中刪除staff_id = gs_staffid的數據
else 轉S2。
S3:for結束i=1 to主菜單數。
S4:調用函數get_menu(MenuName)獲得當前窗口菜單MenuName的所有子菜單,生成菜單樹。每一個主菜單對應一個在tab中自動生成的tabpage頁。
S5:從用戶權限表(satff_limit)中檢索menu_name=MenuName,staff_id =gs_staffid,item_name = MenuItemName的enabled數據。
S6:if enabled=1 then 菜單樹中MenuItemName菜單條選中
Else菜單樹中MenuItemName菜單條不選。
S7:if I≤主菜單數then轉S3
else轉S7。
S8:if 收回權限then從用戶權限表(satff_limit)中刪除staff_id=gs_staffid的所有數據,遍歷菜單樹,將選中的菜單條MenuItemName插入用戶權限表(satff_limit),并設置enabled=1。
2.5菜單權限管理的權限檢查
2.5.1在包含菜單的窗口打開時進行權限檢查
當用戶登錄成功后,在打開應用程序主界面時,或在打開某一子系統主界面時,都要進行權限檢查。
2.5.2權限檢查算法
S1:獲得當前窗口菜單MenuName,用戶工號gs_staffid,調用函數權限檢查函數check_limit (MenuName)。
S2:獲得當前窗口菜單MenuName的菜單項數len=UpperBound(menu_name.item)。
S3:for i=1 to len。
S4:獲得第i個菜單條的菜單條名MenuItemName。
S5:從用戶權限表(satff_limit)中檢索menu_name=MenuName,staff_id=gs_staffid,item_name=MenuItemName的enabled數據。
S6:if enabled=1 then 顯示MenuItemName菜單條及其工具條(若有)
Else隱藏MenuItemName菜單條及其工具條(若有)。
S7:if MenuItemName不是最低一級子菜單 then 遞歸調用權限檢查函數check_limit (MenuItemName)。
S8:if i=i+1≤len then轉S3 else 結束。
該算法實際上是利用遞歸調用的方法,遍歷整個菜單樹的過程。每指向一個菜單,根據用戶權限表(satff_limit)中menu_name=MenuName,staff_id=gs_staffid,item_name=MenuItemName 的enabled值來確定該菜單(條)是否顯示。由于是通過菜單對象對其可見/不可見、顯示/不顯示、工具條顯示/不顯示、菜單名等屬性進行訪問和設置的,應該在窗口的OPEN()事件中進行權限檢查。
2.6菜單權限管理的復用機制
軟件復用一直被視為改善軟件工程的重要手段,人們期望通過復用以前的代碼或組件來提高生產率,改善產品的質量。近十幾年來,軟件復用研究重新成為熱點,被視為解決軟件危機、提高軟件生產效率和質量的現實可行的途徑[6]。為了保證菜單權限管理模塊具有良好的復用性,在設計和實現時,并沒有像文獻[4,7]討論的那樣建立一個菜單表,這樣就避免了權限管理模塊的具體應用相關性。菜單權限管理的權限分配,是在具體應用中根據管理模塊的入口參數(菜單名),動態獲得菜單的各級子菜單及其屬性并進行設置的;菜單權限管理的權限檢查,是按照在菜單權限管理的權限分配時某一用戶獲得的權限,根據權限檢查入口參數(菜單名),利用遞歸調用方式,在動態生成的菜單中,逐項檢查每一條菜單項的權限。所以,整個菜單權限管理不依賴于任何菜單,與具體應用無關。在新的系統中,只需改變入口參數(菜單名),即可重復使用,因而具有良好的復用性。
3結束語
本文提出了一種面向用戶的菜單權限管理方法,該方法能夠將菜單權限的管理細化到每一個用戶,彌補了基于角色的訪問控制技術靈活性不足的缺陷,所以能夠方便、快速地適應企業的人員、管理方面變化的需求。同時,該方法以良好的復用機制,保證在新系統的組建中的復用性,從而延長了其使用壽命,降低了軟件開發強度,提高了軟件質量。該管理模塊完全可以作為一個軟件構件使用,嵌入到需要菜單權限管理的應用中??紤]到用戶數可能比較龐大的情況,該方法在用戶之上建立了用戶組(group_id),允許對用戶組進行菜單權限的分配,用戶組所屬用戶通過繼承,獲得本用戶組的所有授權權限,但菜單權限的檢查仍然是逐個用戶進行的,方法與對用戶的管理是一致的。如果希望繼續細化權限管理,可以將用戶權限管理到按鈕級,文獻[4]討論了這種情況,但當系統比較復雜、用戶數量比較龐大時,按鈕級的權限分配(授予和收回)可能比較困難。
參考文獻:
[1]SANDHU R, COYNE E, FEINSTEIN H, et al. Role-based access control models[J].IEEE Computer, 1996,29(2):38-47.
[2]王姝妲,李濤,楊杰,等.一種基于角色的權限分配及訪問控制模型[J].計算機應用研究,2006,23(10):183-185.
[3]張建英,王秀坤.一種面向應用的基于訪問權限的動態控制方法[J].計算機工程與應用,2003,39(7):120-121.
[4]張志遠, 雷蕾, 沙紅兵.基于窗口按鈕的用戶權限管理[J].計算機應用研究,2003,20(10):105-106.
[5] 張黎明,冉玉晶,呂安,等.基于VB的動態菜單的設計與應用[J].北京工業大學學報,2005(9):452-455.
[6]楊芙清,梅宏,李克勤.軟件復用與軟件構件技術[J].電子學報,1999,27(2):68-75.
[7]唐成華,陳新度, 陳新.管理信息系統中多用戶權限管理的研究及實現[J].計算機應用研究,2004,21(3):217-219.
“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”