趙衛東,畢曉清,盧新明
(山東科技大學信息科學與工程學院,山東青島266590)
早期傳統的訪問控制技術如自主訪問控制、強制訪問控制等技術雖在一定時期內確保了基于Web的管理信息系統 (management information system)權限管理 (包括系統級安全管理如操作系統和數據庫安全和應用級安全管理如應用程序和Web系統安全[1])的安全,但其所能操作的用戶、資源數量有限;基于角色的訪問控制作為目前常用的訪問控制技術雖具有較靈活的授權機制,但其無法解決組織結構復雜、權限變動頻繁的管理信息系統。總之,不同的訪問控制模型各有優缺點并且都無法完全確保靈活、高效的權限管理。本文通過分析多種模型,改進基于角色的訪問控制模型,在該模型基礎上增加屬性約束和用戶組,提出基于角色的細粒度訪問控制模型。通過對細粒度模型進行分析和設計,將其進行具體應用并通過基于SSH2框架的Web系統實現。新模型確保了系統高效的權限訪問控制和靈活的權限管理。
傳統的訪問控制模型有基于對象的訪問控制OBAC、基于任務的訪問控制TBAC和基于角色的訪問控制RBAC模型。其中OBAC以用戶為基本對象進行權限授予,授權過程雖然簡單卻存在對相同權限用戶的重復授權及重復數據冗余等問題。自主訪問控制DAC作為OBAC的一種,通過訪問控制表控制主體對客體的直接訪問,但由于訪問存在傳遞性,系統無法控制主體對客體的間接訪問,由此引發授權混亂。另一種基于對象的強制訪問控制MAC通過為主體和客體設定安全級來保障信息的單向流動,雖能確保訪問的高度安全但靈活性較差且工作量大;TBAC從任務角度建立模型,角色通過任務和權限關聯,實現動態實時的安全控制,卻存在任務分配復雜等問題;RBAC作為目前應用最廣泛的模型,通過創建角色,分別為角色分配不同操作權限,然后為用戶指定一個或多個角色,使用戶通過角色間接地獲得操作權限。該模型通過引入角色減少了權限授予工作量,并對組織變化具有靈活的伸縮性,但卻存在著如下問題:
(1)權限粒度約束不夠細化。粗粒度的權限 (尤其是功能權限)控制導致用戶權限樹過寬卻不深,樹的層次不分明。
(2)權限授予過程復雜。例如對于某高校軟件系中N名教授不同課程的教師,他們具有相同的S種功能權限,管理M個不同的數據對象 (如課程/學生信息),RBAC將分別為N教師分配角色并授予相應S種功能權限和對應M個數據對象,由此進行M×S×N次授權。這對于人員眾多、部門設置復雜且同級部門中的用戶具有相同功能權限的高校,會造成大量的重復授權并導致角色和權限的冗余,增加授權的復雜性。
(3)功能權限和數據權限未實現完全分離。RBAC中對數據對象的操作包含在權限管理中,數據對象的訪問和管理較亂,無法準確獲取角色不同功能權限對應的不同數據對象。如對于具有授課教師A角色的某用戶,具有查看和修改學生信息的功能權限,但無法確保他能查看某學院1班和2班學生的信息,卻只能修改1班學生的信息。
(4)具體應用復雜,效率低下。對于登錄驗證、訪問數據庫等操作存在重復性,且客戶端不斷向服務器提交重復的T-SQL語句,由此增加服務器負擔,降低服務器處理效率。
針對RBAC存在的問題,唐金鵬等人[2]提出面向用戶屬性的RBAC模型,增加屬性集合和約束,通過用戶屬性實現動態的分配角色。然而此方法無法確保通過多個屬性組合得到的角色間不存在冗余,不會引起角色分配混亂等問題;趙靜[3]等人提出的基于數據對象的RBAC模型,實現了數據對象和功能權限的分離。但此模型以數據對象為主,通過UD、RD和PA三次才完成權限分配,授權過程復雜且當數據對象數量過多時依次為數據對象分配角色的工作量巨大,極易出錯。對于數據對象變動較大的單位部門,每增加或刪除一個數據對象可能牽扯多個角色,由此可能引發RD混亂,并刪除或增加很多角色,造成角色冗余。
本文從訪問控制的粒度出發,提出基于角色的細粒度模型解決RBAC存在的上述問題:
(1)通過細粒度權限管理 (即將權限分解為原子鏈接或按鈕等可訪問集合并按此粒度管理),按盡量小的粒度將功能權限分解為增加/修改/刪除/打印等原子操作,并將權限以字符串形式存儲到數據庫,最后以用戶權限樹葉子節點的形式展現。
(2)引入用戶組,將具有相同角色 (功能權限相同,操作數據對象不同)的用戶集合成組,通過為用戶組直接分配角色,避免權限/角色的重復授予和冗余并保留角色間的繼承關系,允許直接為用戶指定角色。
(3)分離功能權限和客體對象,從功能權限和其對應數據對象兩方面入手,授權時先分配功能權限,然后分配其所能操作的數據對象。通過編寫包含屬性約束的存儲過程,到數據庫中獲取用戶不同的功能權限所對應的不同數據對象,并轉換獲取到的結果加載到前臺顯示;當用戶數據對象改變時,通過權限管理樹更新權限數據表中的數據對象范圍即可。
(4)封裝常用控件成復合控件以完成基本登陸驗證功能;編寫存儲過程集合封裝用戶對任務的重復操作避免每次寫重復訪問語句,由此提高批量語句的執行速度并能避免越權訪問。
細粒度模型確保了權限訪問控制的細粒度實現,提高了動態訪問控制的安全性。作為基于角色的通用模型RBAC96[4]的擴展,其模型圖如圖1所示。

圖1 基于角色的細粒度訪問控制模型
模型中各元素的定義和描述如下:
(1)用戶U、用戶組G、角色R、權限P、會話S分別表示用戶集、用戶組集、角色集、權限集和會話集;OP操作表示功能權限集add/delete等,OB對象表示客體對象集(客體對象作為系統保護的資源如數據庫中數據、內存中的片段等。本文中的客體對象為數據對象)。
(2)UA((G×R)∪ (U×R)表示為用戶分配角色。一個用戶組可被分配多個角色,一個角色可被分配給多個用戶組,對具有獨立訪問權限的部分用戶直接為其分配角色;GH(G×G,表示用戶組間的層次關系;RH(R×R則表示角色間的層次關系。授權關系圖如圖2所示。
(3)PA P×R,表示角色的權限分配。一個角色可擁有多個權限,一個權限可屬于多個角色;其中P=OP×OB,OP是管理員為角色分配的操作權限,OB是管理員為角色中的功能權限單獨分配的對應數據對象 (通過增加check-box屬性的用戶權限樹實現)。

圖2 授權關系
(4)user(Si):S→ (U∪G),表示會話與用戶的映射。用戶User(Si)創建的會話S中包含用戶激活的角色集合 (一個用戶可同時擁有多個會話)。
(5)roles(Si):S→2R,表示會話與角色集的映射。roles(Si)({r|(MYMr’≥r)[(user(Si),r)∈UA]}是會話Si對應的角色集合;會話Si對應權限為:Ur∈roles(Si){p|(MYMr’≥r)[(p,r)∈PA]},其中用戶具有權限為會話集中所有權限并集。
(6)約束:同RBAC2中的約束,包括互斥角色約束(即不能在一次會話中為用戶組/用戶分配互斥的角色)、基數限制 (即限定授予給用戶組/用戶的角色數量)、先決條件約束 (即僅當具有某種操作許可時才可分配角色)及時間、頻度約束等。
(7)屬性約束:表示約束條件。以用戶屬性、功能權限等作為約束條件,將其封裝到包含眾多T-SQL語句的存儲過程中,通過調用該存儲過程 (具體介紹如3.3)獲取不同功能權限操作的不同數據對象。
基于角色的細粒度訪問控制模型具有較強的通用性,能確保高效靈活的訪問控制。其模型類圖[5]如圖3所示。

圖3 細粒度模型的類圖
類圖中的User對應數據庫中的用戶表,Group對應用戶組表,Role對應角色表,Op對應功能權限表,Ob對應數據對象表,Stu對應學生表;UR表示用戶角色的授予表,GR表示用戶組角色的授予表,RA表示角色權限的授權表,AttrCons表存儲用戶所有功能權限及其所能操作的數據對象,通過Userid和OPid來確定OBid。最后分解獲取到的OBid并在數據庫中的表中查找符合OBid屬性的數據信息返回到前臺[6]。
該模型在具體的應用中包括登錄驗證、權限訪問控制和權限管理三部分。用戶登陸進行身份驗證,然后系統為合法用戶加載初級用戶權限樹,用戶點擊初級加載樹中的葉子節點來訪問對應的功能權限,最后調用存儲過程獲取功能權限對應的數據對象并返回給前臺界面顯示。具體如下:
登錄驗證能確保用戶的合法登錄。封裝常用驗證控件[7]成復合控件checkUserForm,該控件擴展FormPanel,能確保用戶輸入驗證及合法身份驗證。控件的構造如下:
Ext.namespace("Ext.ux.form");//為新控件 check-UserFormt創建命名空間:
Ext.ux.form.userCheckForm = Ext.extend(Ext.form.userCheckForm,{//擴展Form控件
… //復合控件中所包含的控件及其屬性與方法
url:‘check.Action’;//提交用戶輸入的信息到check.Action驗證
});
Ext.reg(‘userCheckForm’,Ext.ux.Checkform);//完成該組件類型的注冊
通過在Ext.onReady(function(){...});中增加{xtype:‘userCheckForm’}完成復合控件的調用。復合將獲取到的用戶信息提交的具體的url進行用戶身份驗證,具體實現過程如圖5所示。
3.2.1 功能權限的訪問控制
權限的訪問控制能確保用戶訪問指定的權限資源,避免越權訪問。通過用戶權限樹 (Extjs中的異步樹組件)實現為不同用戶加載顯示不同的樹節點,從而確保安全的訪問控制。該權限樹的實現包括初始權限樹的加載和權限樹的級聯加載:
(1)初始權限樹的加載:為保證用戶不花長時間等待用戶權限樹的數據加載和首次渲染,設計權限樹先向用戶加載包含一級節點 (根的子節點)的初始權限樹。用戶點擊一級樹節點,通過層層的級聯加載直至訪問葉子節點。此方式與一次性加載整棵權限樹相比不但省時而且確保頁面不會頻繁刷新,提高了用戶訪問體驗。用戶通過登錄驗證后,系統以獲取到的用戶Userid作為參數,獲取該用戶對應的角色并查找角色所對應的功能權限,最后獲取根節點的一級子節點返回前臺顯示,完成初始權限樹的加載。
(2)權限樹級聯加載:用戶點擊初始權限樹中的節點,層級的加載其對應子節點直至葉子節點,點擊葉子節點對功能權限的訪問。在層級加載過程中,需要獲取到所有功能權限對應的葉子節點到根節點的權限路徑,在加載節點的過程中,通過判斷用戶點擊所節點的加載路徑是否在權限路徑中來確定是否加載相應子節點。其中獲取權限路徑的遞歸算法findNodePath(List<resource>);實現的思想為:查找用戶權限集listResource中每個葉子權限節點到根節點的路徑 (所經過的所有resource節點的id),并將路徑保存到數組a中,由此得到權限加載路徑數組。算法內容如下:
For(Resource r:re){//依次對每個權限/Resource進行處理
for(int j=0;j<a.length-1;j++){//指定數組初始長度:a[200]
a [j]=r.getResourceId();//獲取 Resource 的節點id
a[j+1]=r.getParentId();//獲取該節點的父節點的id
r = resourceDao.getReourceById (r.getParentId());//查找該父節點的父節點并判斷其是否存在
if(r==null){//不存則說明為根節點,跳出這個循環
j++; //若存在,則繼續循環直至找到根節點
break;}}}
當用戶點擊權限樹中的節點時,系統調用resourceD-ao.findByParentIdAndIds(id,a);方法查詢該節點是否具在合法的訪問路徑中,若有則返回該節點的路徑加載信息繼續加載;若無則提示用戶不具有繼續操作的權利。其中id為 通 過 樹 的 depTreeLoader.on ('beforeload',function(depTreeLoader,node));方法獲取用戶點擊的樹節點的id。路徑檢查方法如下:
public List<Resource> findByParentIdAndIds(int parentId,int ids[]){//查找點擊節點的子節點
String paramsInt="(";//將用戶權限數組a轉換成字符串形式,方便比對
for(int i=0;i<ids.length-1;i++){
paramsInt=paramsInt+ids [i]+","; }
paramsInt= paramsInt+ids[ids.length-1]+")";
String queryString= "from Resource r where r.parentId=" +parentId+"and r.resourceId in" +paramsInt;//查詢以parentId為父節點的該用戶所具有的子節點的字符串,防止越界訪問
List<Resource> listResource= getHibernate-Template().find(queryString);
return listResource;}
(3)用戶權限樹的顯示:由于Extjs通過Json數據與后臺異步交互,故用戶權限樹只接受格式為: [{text:″TreeName″,id:″″,parentId:″0″,leaf:true}]}](id 為樹節點,text為樹結點內容,leaf指節點是否為葉子,parentId是父節點)的Json數組才能確保樹形結構的顯示。由于Resource的屬性格式與JSON形式不符,由此增加Tree表,將Resource表中的屬性列與樹所需的Json數組對象一致,將listResource依次轉換成Tree表的標準Json格式,然后將結果存放到struts.xml中配置的Json類型的參數menuList中自動加載給前臺異步樹顯示。
由此完成了權限樹的級聯加載。按照此方法,用戶可按照自己的需要顯示相應功能權限,無需每次登陸都完全展示整棵權限樹,確保高效的異步訪問控制。
3.2.2 數據對象的訪問控制
用戶權限樹確保了用戶功能權限的安全訪問控制。按照訪問控制的細粒度,不同的功能權限對應不同的數據對象。由此整合T-SQL語句編寫存儲過程并將其存儲到數據庫中,然后調用存儲過程獲取角色不同的功能權限所對應的數據對象。
存儲過程封裝了用戶對任務的重復操作,通過選擇性調用此預先編譯的存儲過程,不必每次寫重復語句,提高批量語句的執行速度。在編寫過程中,需要確定存儲過程的輸入和輸出參數并完善主體內容。其中輸入參數包括用戶名Username(通過它獲取功能權限操作對應的數據對象),權限樹的節點編號treenode(通過它獲取用戶選擇的功能權限),數組DataObjects(權限數據表獲取的數據對象)。例如通過存儲過程findUserObjects查找具有輔導員角色的用戶所能編輯的學生信息:
Use RuanjianShijianPingtai//存放用戶表、角色表等數據信息的數據庫
Create Procedure findUserObjects@Username char(8),@treenode char(8),@Data Objects List Output
AS
BEGIN
Select obj from AttrCons u where u.username=@Username and u.fun=@treenode
在調用時,執行語句 EXEC pro findUserObjects@’zhangsan’,@’update’,@Datalist OUTPUT即可。當返回形式如 {D200901,F201203}的數據對象信息時,表示具有輔導員角色的該用戶能夠編輯的學生對象為D200901(信息學院2009級1班)的學生和F201203(外語學院2012級的3班)的學生信息。
然而,存儲過程中所查詢出來的功能權限對應的數據都是對象的形式,要輸出該數據對象信息,需要以其屬性為條件到數據庫中查詢符合該條件的數據表中的數據信息,并將其返回到前臺Grid數據面板顯示。對如D200901的數據對象,按以下屬性進行分解:D代表學院如信息學院、2009代表年級、01代表班級。根據學院/年級等屬性,到stu表中讀取符合條件的數據并加載顯示。通過調用存儲過程獲取數據與通過查表方法所得到的結果是一致的,但是此方法大大提高了執行效率。
在用戶權限樹中設定Checkbox屬性為true,構造出用戶權限管理樹。通過選中或取消用戶權限管理樹中節點前的復選框,能方便的實現角色權限的授予、權限數據對象的指定以及用戶組的分配等。其中角色的權限授予如圖4所示。

圖4 用戶權限管理樹
選中一級節點前的復選框則其所有子節點被選中。選擇完成后點擊保存修改按鈕,修改信息會自動保存并映射到數據庫中的AttrCons/RA/GR/PA/UR/RA表中,下次加載用戶權限樹的時候會讀取更新的表中的信息以實現權限樹的更新加載,確保角色/權限的靈活授權和管理。
選取基于B/S的軟件工程實踐平臺實現細粒度模型。該Web系統采用 Java語言,選取 myeclipse集成環境、mysql數據庫等進行開發。通過搭建SSH2框架并整合Extjs技術[8],將系統按照MVC設計思想分為顯示層、業務邏輯層、數據訪問層等,各層間調用完全面向接口,實現了插件式編程,降低耦合度。系統權限訪問控制實現過程的順序圖[9-10]如圖5 所示。

圖5 權限訪問控制實現順序
系統最終實現結果如圖6所示。

圖6 系統的實現
本文通過分析、比較各種常用的訪問控制技術,選取基于角色的訪問控制模型,在模型中增加屬性約束和用戶組所構建的基于角色的細粒度訪問控制模型有效解決了目前管理信息系統的權限授予和管理過程中存在的授權復雜性、角色冗余性問題,減少了權限授予的數量,提高了權限授予的效率并確保了準確、靈活的權限訪問控制。然而,此細粒度模型在解決模型沖突、角色繼承關系的私有權限等問題上仍存在缺陷,需通過深入的分析、研究加以改進和完善。
[1]WU Jiangdong,LI Weihua,ANXifeng.Method of finely granular access control based on RBAC [J].Computer Engineering,2008,34(20):52-54(in Chinese).[吳江棟,李偉華,安喜鋒.基于RBAC的細粒度訪問控制方法[J].計算機工程,2008,34(20):52-54.]
[2]ZHAO Jing,YANG Rui,JIANG Luansheng.RBAC permission access control model based on data objects[J].Computer Engineering and Design,2010,31(15):3353-3355(in Chinese).[趙靜,楊蕊,姜灤生.基于數據對象的RBAC權限訪問控制模型[J].計算機工程與設計,2010,31(15):3353-3355.]
[3]TANG Jinpeng,LI Linglin,YANGLuming.User attributes oriented RBAC model[J].Computer Engineering and Design,2010,31(10):2184-2186(in Chinese).[唐金鵬,李玲琳,楊路明.面向用戶屬性的RBAC模型[J].計算機工程與設計,2010,31(10):2184-2186.]
[4]SHEN Lei,ZHANG Yuan,JIANG Ping.Design and implementation of rights management based on RBAC in Web[J].Computer Era,2010(10):49-51(in Chinese).[沈磊,張媛,蔣平.基于RBAC的權限管理在Web中的設計與實現 [J].計算機時代,2010(10):49-51.]
[5]LIU Hongbo,LUO Rui,WANG Yongbin.Competence system based on RBAC design and implementation[J].Computer Technology and Development,2009,19(9):154-156(in Chinese).[劉宏波,羅銳,王永斌.一種采用RBAC模型的權限體系設計 [J].計算機技術與發展,2009,19(9):154-156.]
[6]DU Hongyan,PAN Yi,HUANG Caixia,OU Xinliang.Application of OC-RBAC model in MIS[J].Huazhong Univ of Sci& Tech(Natural Science Edition),2009,37(9):53-55(in Chinese).[杜紅艷,潘怡,黃彩霞,等.OC-RBAC模型在管理信息系統中的應用 [J].華中科技大學學報 (自然科學版),2009,37(9):53-55.]
[7]FAN Minghu,FAN Hong,WU Xiaojin.Competence system based on RBAC design and implementation [J].Computer Engineering,2010,364(1):143-145(in Chinese).[范明虎,樊紅,伍孝金.Universal Privilege Management System Based on RBACin ASP.net[J].計算機工程,2010,364(1):143-145.]
[8]LI Tianming,HE Yueshun.Research on privilege management based on ExtJStechnology and SSH framework [J].Computer Applications and Software,2011,28(5):165-167(in Chinese).[李天鳴,何月順.基于Extjs技術與SSH框架的權限管理研究[J].計算機應用與軟件,2011,28(5):165-167.]
[9]SONG Yun,LI Feng.Design and implementation of access control under B/Ssystem based on RBAC [J].Software Guide,2009,8(7):28-30(in Chinese).[宋云,李峰.基于RBAC的B/S系統訪問控制設計與實現 [J].軟件導刊,2009,8(7):28-30.]
[10]LIAO Junguo,HONG Fan,XIAO Haijun,et al.Authorization management research based on extjs and SSH framework [J].Computer Engineering and Applications,2007,43(34):138-140(in Chinese).[廖俊國,洪帆,肖海軍,等.細粒度的基于角色的訪問控制模型[J].計算機工程與應用,2007,43(34):138-140.]