倪泰山,周永剛
(1.云南省紅河州地震局,云南蒙自 661100;2.北京市延慶縣地震局,北京 102100)
B/S結(jié)構(gòu)軟件系統(tǒng)權(quán)限管理的精粒度實現(xiàn)*
倪泰山1,周永剛2
(1.云南省紅河州地震局,云南蒙自 661100;2.北京市延慶縣地震局,北京 102100)
介紹了B/S結(jié)構(gòu)軟件設(shè)計中的精粒度權(quán)限管理的思路及方法,運(yùn)用 Java高級程序設(shè)計語言,采用 Struts2+Hibernate+Spring框架,結(jié)合 DWR技術(shù)實現(xiàn)了軟件系統(tǒng)中的權(quán)限管理,并將該技術(shù)應(yīng)用到云南省的臺站管理系統(tǒng)的后臺管理中。
B/S結(jié)構(gòu);數(shù)據(jù)庫;權(quán)限管理;訪問控制列表
在基于 B/S結(jié)構(gòu)或 C/S結(jié)構(gòu)的軟件系統(tǒng)中,權(quán)限管理是一個基礎(chǔ)的而且非常重要的模塊。權(quán)限管理設(shè)計的好壞,直接影響到軟件系統(tǒng)的安全性、可維護(hù)性和可擴(kuò)展性。權(quán)限管理有多種實現(xiàn)技術(shù),最簡單的是基于用戶的權(quán)限管理(倪泰山等,2009),另一種是基于角色、組、用戶的權(quán)限認(rèn)證技術(shù),這種技術(shù)將具有相同權(quán)限的用戶劃歸同一角色或同一個組,然后將權(quán)限賦予角色,實現(xiàn)精細(xì)的權(quán)限控制。
在“地震臺站綜合管理系統(tǒng)”2.0版的設(shè)計中,設(shè)計人員采用開源框架 Struts2+Hibernate+Spring技術(shù)進(jìn)行代碼重構(gòu),使用 DWR框架實現(xiàn)后臺與前臺交互,權(quán)限管理采用基于 “角色 +用戶”的認(rèn)證技術(shù),從而實現(xiàn)了對用戶權(quán)限的精細(xì)控制。
粒度問題是數(shù)據(jù)倉庫設(shè)計的一個最重要方面。粒度是指數(shù)據(jù)倉庫的數(shù)據(jù)單位中保存數(shù)據(jù)的細(xì)化或綜合程度的級別。
(1)用戶(或角色)粒度。它可以精細(xì)到角色或具體的用戶,由系統(tǒng)管理員將某一資源的訪問權(quán)限授權(quán)給角色或用戶,從而實現(xiàn)對數(shù)據(jù)庫的CRUD(Create,Read,Update,Delete)操作。這里的角色可以理解為實際工作中的崗位、職位或者分工。角色和用戶組看起來很相似,但卻有著本質(zhì)的區(qū)別,最主要的區(qū)別在于:用戶組是一個用戶的集合,并不涉及它的授權(quán)許可;而角色則既是一個用戶的集合,又是一個授權(quán)許可的集合。
(2)操作對象粒度。對數(shù)據(jù)庫的查詢、增加、更新、刪除等操作,是由具體的模塊實現(xiàn)的(劉敦敏,2004)。對于新注冊的用戶,一般可以自動賦予查詢權(quán)限,對沒有特別限制的模塊中實現(xiàn)的功能,都可以進(jìn)行數(shù)據(jù)瀏覽。增加、更新、刪除等功能則由系統(tǒng)管理員在授權(quán)頁面對角色或某一具體用戶進(jìn)行模塊的 CRUD授權(quán),用一個正整數(shù)的低 4位的取值表示 CRUD權(quán)限,位的取值為“1”表示允許,取值為 “0”表示不允許。0001為十進(jìn)制的 1,擁有 C權(quán)限;0010為十進(jìn)制的 2,擁有 R權(quán)限;0100為十進(jìn)制的 4,擁有 U權(quán)限;1000為十進(jìn)制的 8,擁有 D權(quán)限。它們之間進(jìn)行“與”運(yùn)算則構(gòu)成組合權(quán)限。例如,某角色對某一資源的權(quán)限為 1101(十進(jìn)制 13),表示該角色對該資源具有 CRD權(quán)限,但沒有 U(更新)權(quán)限。
權(quán)限管理作為 B/S結(jié)構(gòu)軟件系統(tǒng)的基礎(chǔ),采用 5張數(shù)據(jù)庫表來維持。模塊數(shù)據(jù)表(T_Modules)記錄每個模塊的名稱(前臺主菜單名稱)及子模塊名稱(前臺子菜單名稱)、入口地址等信息,它是前臺顯示菜單的主要依據(jù)。用戶信息記錄在用戶數(shù)據(jù)表(T_Users)中,角色信息記錄在角色數(shù)據(jù)表(T_Roles)中。用戶與角色是 “多對多”關(guān)系,靠用戶角色數(shù)據(jù)表(T_UserRoles)通過外鍵方式來維護(hù)。用戶或角色對某一資源的授權(quán)信息則記錄在 ACL數(shù)據(jù)表(T_ACL)中。它們之間的關(guān)系及物理模型見圖 1。
圖 1 權(quán)限管理數(shù)據(jù)表及關(guān)系的物理模型Fig.1 RightsManagement database tables and relations bet ween the physicalmodel
在ACL數(shù)據(jù)表中,主體類型一般是指用戶或角色。當(dāng)主體類型為用戶時主體標(biāo)識為用戶 id,當(dāng)主體類型為角色時主體標(biāo)識為角色 id。資源標(biāo)識就是指模塊 id。授權(quán)狀態(tài)是一個正整數(shù)的低 4位二進(jìn)制表示的權(quán)限組合。
權(quán)限管理包括授權(quán)和認(rèn)證。授權(quán)是指將某一資源的 CRUD操作授權(quán)給用戶或角色。認(rèn)證是確認(rèn)用戶對某一資源是否具有相應(yīng)權(quán)限的過程。
授權(quán)包括角色授權(quán)和用戶授權(quán)。角色授權(quán)就是先建立某一角色,然后對這個角色能訪問的資源進(jìn)行 CRUD權(quán)限分配,再將角色分配給具有相同權(quán)限的用戶。角色授權(quán)的優(yōu)點是可以批量授權(quán),可以極大地提高管理效率。用戶授權(quán),就是將資源的訪問權(quán)限直接授權(quán)給某個具體的用戶。
要實現(xiàn)權(quán)限的精粒度控制,就必須允許用戶自行定義角色,然后對角色進(jìn)行授權(quán),而不是由軟件設(shè)計者在寫程序時就預(yù)先固定角色。而且這種精粒度的權(quán)限管理必須達(dá)到對菜單級的精細(xì)控制以及對 WEB頁面上的按鈕級的精細(xì)控制。在B/S結(jié)構(gòu)的軟件系統(tǒng)中,對數(shù)據(jù)的增加、讀取、修改、刪除等操作都是通過WEB頁面上的相應(yīng)按鈕或超鏈接的方式實現(xiàn)的。用戶點擊按鈕將觸發(fā)相應(yīng)的請求,服務(wù)器端收到請求后調(diào)用業(yè)務(wù)邏輯完成相應(yīng)的 CRUD操作。例如,用戶點擊 “增加”按鈕,一般會出現(xiàn)增加數(shù)據(jù)的WEB頁面,用戶填寫好相關(guān)的表單,單擊 “提交”按鈕后,將觸發(fā)“添加”(Create)請求并發(fā)送給服務(wù)器端,服務(wù)器端收到請求后在后臺調(diào)用添加數(shù)據(jù)的業(yè)務(wù)邏輯,將數(shù)據(jù)持久化到數(shù)據(jù)庫中,完成對數(shù)據(jù)的添加操作。也就是說,實現(xiàn)精細(xì)控制的權(quán)限管理后,如果用戶對某一資源具有相應(yīng)權(quán)限(例如刪除權(quán)限),則在客戶端的軟件界面上 “刪除”按鈕對該用戶是可見的,否則就是屏蔽的。
在具體的程序?qū)崿F(xiàn)過程中,授權(quán)就是將該角色能訪問的資源標(biāo)識(模塊 id)和角色標(biāo)識(角色 id)以及它對該資源具有的 CRUD權(quán)限(一個正整數(shù)的低 4位對應(yīng)的二進(jìn)制組合)寫入 ACL數(shù)據(jù)表,完成授權(quán)數(shù)據(jù)的持久化操作。
認(rèn)證就是用戶登錄后,系統(tǒng)根據(jù)他所擁有的權(quán)限,列出相應(yīng)的菜單。具有不同權(quán)限的用戶登錄后,前臺展現(xiàn)的菜單是不同的。
在具體實現(xiàn)程序時,認(rèn)證就是從 ACL數(shù)據(jù)表中檢索出登錄到系統(tǒng)的用戶所能訪問的資源標(biāo)識(即模塊 id),形成前臺顯示菜單需要的數(shù)據(jù)格式,供前臺顯示菜單使用。同時,將用戶所能訪問的資源標(biāo)識及用戶對該資源具有的 CRUD權(quán)限(一個正整數(shù)的低 4位對應(yīng)的二進(jìn)制組合),寫入 session中,然后在視圖(一般是 jsp頁面)上從 session中取出用戶的 ACL控制列表,根據(jù)用戶擁有的權(quán)限,在 jsp頁面上進(jìn)行判斷,然后根據(jù)判斷結(jié)果分別顯示 “讀取”、“增加”、“刪除”、“更新”等按鈕,實現(xiàn)精粒度的權(quán)限控制。
在編程過程中,一個用戶可能擁有多個角色,同時也可能擁有單獨的用戶授權(quán)。此時,要先從數(shù)據(jù)庫的 T_ACL表中查詢出該用戶擁有的角色的權(quán)限列表,再查詢出該用戶擁有的單獨權(quán)限列表,對它們進(jìn)行“與”運(yùn)算,最后形成該用戶的權(quán)限列表。在這一過程中,角色所擁有的權(quán)限可能會與用戶單獨擁有的權(quán)限重復(fù),但通過 “與”運(yùn)算后,就可以剔除重復(fù)的權(quán)限。
B/S結(jié)構(gòu)的軟件系統(tǒng)中,一般具有導(dǎo)航菜單,每一個導(dǎo)航菜單實現(xiàn)相應(yīng)的功能。例如在 “地震臺站管理系統(tǒng)”中,導(dǎo)航菜單具有 “臺站管理”、“儀器管理”、“人員管理”、“用戶管理”、“角色管理”等一級菜單,這些導(dǎo)航菜單對應(yīng)軟件中的模塊,每個模塊完成相應(yīng)的功能。每一個導(dǎo)航菜單都具有菜單名稱、入口地址(類似于網(wǎng)址)等信息,它們存放在數(shù)據(jù)庫的模塊管理數(shù)據(jù)表中。在讀寫數(shù)據(jù)庫時,采用 Hibernate與數(shù)據(jù)庫 “打交道”,權(quán)限管理中所用的實體類(也叫 VO類、Pojo類)類圖及其關(guān)系見圖 2。
圖 2 權(quán)限管理中的實體類類圖及其關(guān)系(北京尚學(xué)堂科技有限公司,2008)Fig.2 Rights Management in the entity class diagram and their relations(Beijing Shangxue Tang Technology Co.,Ltd.,2008)
在程序設(shè)計過程中,筆者采用 Struts2+Hibernate+Spring架構(gòu),授權(quán)部分使用 DWR框架。由于每個實體都要進(jìn)行寫入、讀取、更新、刪除、分頁等操作,因此筆者使用 Java的泛型設(shè)計了一個 Generic Dao基類,該基類繼承自 Spring提供的Hibernate Dao Support類,可以完成基本的 CRUD、分頁等操作。對 ACL、User、Role等的 Dao操作則設(shè)計繼承于 Generic Dao的子類,只要傳入相應(yīng)的實體即可。同時,為了方便軟件的維護(hù),筆者設(shè)計了 Service層,在 Service層完成業(yè)務(wù)邏輯,并調(diào)用Dao層完成對數(shù)據(jù)庫的操作。前臺與后臺的“溝通”由 Struts2的 Action完成,在 Action中調(diào)用Service層的業(yè)務(wù)邏輯來處理業(yè)務(wù)需求,然后將處理結(jié)果轉(zhuǎn)發(fā)至前臺 jsp頁面。各種 Dao、Service、Action則統(tǒng)一由 Spring容器進(jìn)行管理。
(1)授權(quán)過程:建立角色→對角色進(jìn)行授權(quán)(資源與角色關(guān)聯(lián))→將角色分配給用戶(角色與用戶關(guān)聯(lián))。建立角色的過程十分簡單,采用Struts2的 Domain模型傳遞參數(shù),Struts2在 Action中會自動根據(jù)前臺傳入的角色數(shù)據(jù)實例化一個Role類,只需要在 Action中調(diào)用 role Service(完成對角色數(shù)據(jù)的 CRUD、分頁等操作)的添加方法將其持久化到數(shù)據(jù)庫中即可。而授權(quán)包含對角色的授權(quán)和單獨對用戶授權(quán),當(dāng)前臺用戶點擊復(fù)選框(圖 3)將其選中時,后臺會根據(jù)主體標(biāo)識(角色或用戶)作出判斷,當(dāng)主體標(biāo)識為 “角色”時將主體標(biāo)識(Role)、資源 id、角色 id、對該資源的CRUD權(quán)限(一個正整數(shù)的低 4位)寫入數(shù)據(jù)庫;當(dāng)主體標(biāo)識為“用戶”時將主體標(biāo)識(User)、資源 id、用戶 id、用戶對該資源的 CRUD權(quán)限寫入數(shù)據(jù)庫。當(dāng)取消復(fù)選框時,則應(yīng)從數(shù)據(jù)庫中刪除以上信息。在實現(xiàn)這一操作時,筆者使用 DWR框架完成授權(quán)頁面與后臺業(yè)務(wù)邏輯 Service層的交互,在不刷新頁面的情況下就可以完成以上操作。
圖 3 精細(xì)權(quán)限管理在地震臺站管理系統(tǒng)后臺管理中的應(yīng)用Fig.3 Fine-right management in the Seismic Station Management System
(2)認(rèn)證過程:驗證用戶登錄→根據(jù)用戶 id查找其擁有的角色,從 T_Acl數(shù)據(jù)表中查找角色擁有的權(quán)限→根據(jù)角色的權(quán)限查詢模塊資源(菜單)列表,同時將權(quán)限列表寫入 session→前臺顯示菜單,完成認(rèn)證過程。在認(rèn)證過程中,首先檢查用戶登錄是否成功,成功后才查找用戶的權(quán)限。
驗證用戶的操作是在 Struts2的 login Action中完成的,如果驗證成功,則調(diào)用業(yè)務(wù)邏輯 Acl Service,從數(shù)據(jù)庫中檢索出用戶擁有的權(quán)限,根據(jù)權(quán)限從模塊數(shù)據(jù)表中檢索出模塊信息放入module List,同時將用戶權(quán)限放入一個 acl List,然后寫入 session中。最后 login Action轉(zhuǎn)發(fā)到前臺的主頁面,主頁面上用 Struts2的
在實際應(yīng)用中,前臺主菜單一般都需要美化處理。主界面有左側(cè)樹形菜單導(dǎo)航,也有頂部下拉菜單導(dǎo)航,具體采取哪種導(dǎo)航菜單,需根據(jù)項目的實際需要決定。而前臺需要什么樣的菜單數(shù)據(jù),只需要在 Struts2的用戶驗證的 Action中構(gòu)造就行了。在“地震臺站管理系統(tǒng)”中,前臺菜單是用 ExtJS框架展示的樹形菜單,所以菜單資源返回的列表數(shù)據(jù)要轉(zhuǎn)化成 json字符串。
云南是地震多發(fā)地區(qū),通過多年的建設(shè),已形成了國家級、省級及市(縣)級三級地震監(jiān)測臺站體系。為了提高臺站管理效率,摸清全省的臺站數(shù)目、觀測項目、觀測儀器、人員配置等資源,在云南省地震局青年基金的資助下,我們于2006年設(shè)計了基于 B/S的云南 “地震臺站管理系統(tǒng)”。該系統(tǒng)的建成,極大地提高了工作效率。在系統(tǒng)運(yùn)行過程中,因?qū)嶋H工作需要,要求系統(tǒng)增加相應(yīng)的功能。這時,我們發(fā)現(xiàn)原來的權(quán)限管理設(shè)計不利于管理新增加的需求的權(quán)限控制,需要修改的代碼較多。在這種情況下,我們對 “地震臺站管理系統(tǒng)”中的權(quán)限管理重新進(jìn)行評估,并按本文所述的思路及方法重構(gòu)了原有的代碼,對“地震臺站管理系統(tǒng)”中的各種資源實現(xiàn)了精細(xì)的權(quán)限管理,并且實現(xiàn)了臺站人員只能刪除或修改自己添加的資料,其余資料只能查看的更為精細(xì)的權(quán)限控制(圖 3)。
采用精粒度的權(quán)限管理后,提供給客戶的軟件產(chǎn)品可以由客戶定制角色,而不是由程序員將角色及相應(yīng)權(quán)限寫死。對具體用戶的權(quán)限也由系統(tǒng)管理員決定。精粒度權(quán)限管理還可以實現(xiàn)Web頁面上的“增加”、“刪除”、“更新”、“讀取”的按鈕級的控制,在新的權(quán)限管理體系下,“地震臺站管理系統(tǒng)”若需再增加新的需求,只需要編寫新功能的實現(xiàn)代碼,然后將新功能的菜單名稱和入口地址加入到模塊數(shù)據(jù)表中(具體由菜單管理模塊實現(xiàn)),由管理員對新增的功能菜單進(jìn)行授權(quán)即可,對原有的代碼不作任何修改,這極大地提高了系統(tǒng)的維護(hù)效率,節(jié)約了系統(tǒng)的維護(hù)成本。
本文討論了精細(xì)的權(quán)限管理的實現(xiàn)方法,權(quán)限管理在B/S結(jié)構(gòu)的軟件系統(tǒng)中具有舉足輕重的地位。這種權(quán)限管理技術(shù)在辦公自動化(OA)系統(tǒng)、CMS內(nèi)容管理系統(tǒng)等各種 B/S的業(yè)務(wù)處理系統(tǒng)中得到廣泛應(yīng)用,而采用 Struts2+Hibernate+Spring框架則是當(dāng)前 Java陣營的主流技術(shù)。采用這種精細(xì)的權(quán)限控制后,由于系統(tǒng)的主頁面的菜單存儲在數(shù)據(jù)庫中,以后要擴(kuò)展業(yè)務(wù)應(yīng)用時,只需要設(shè)計相應(yīng)的業(yè)務(wù)邏輯,然后將其入口地址等寫入到數(shù)據(jù)庫的模塊數(shù)據(jù)表,不需要修改原來的業(yè)務(wù)應(yīng)用就可以達(dá)到擴(kuò)展的目的,真正實現(xiàn)了軟件設(shè)計的積木效果,大大提高了軟件的維護(hù)效率。因此,這種精細(xì)的權(quán)限管理技術(shù)可以作為B/S軟件系統(tǒng)的一個基本組件,只要是B/S的軟件,都可以在用它來“建造”,使軟件的應(yīng)用范圍更加廣泛。
北京尚學(xué)堂科技有限公司 .2008.OA視頻項目教程權(quán)限管理部分[EB/OL].(2008-02-19)[2009-06-12].http://www.very-cd.com/groups/@u2857352/237347.topic.
蔡雪燾 .2006.Hibernate開發(fā)及整合應(yīng)用大全[M].北京:清華大學(xué)出版社.
劉敦敏.2004.B/S模式的煙草信息管理系統(tǒng)權(quán)限管理的實現(xiàn)[EB/OL].(2004-08-19)[2009-05-15].http://www.tobacco.org.cn/news/dspNews.jsp id=47993.
倪泰山,闕云彩,李祥,等 .2009.基于 B/S結(jié)構(gòu)的地震臺站綜合信息管理系統(tǒng)的設(shè)計與實現(xiàn)[J].地震研究,32(1):89-93.
徐會生,何啟偉,康愛媛 .2009.深入淺出 Ext JS[M].北京:人民郵電出版社 .
Realization of the Precise Size of the Managenment of Rights of Software System Based on B/S
NI Tai-shan1,ZHOU Yong-gang2
(1.Earthquke Administration of Honghe Prefecture of Yunnan Province,Mengzi 661100,Yunnan,China)
(2.Earthquke Administration of Yanqing County of Beijing,Beijing102100,China)
Firstly,we introduce the fine granularity of right management ideas and methods in the B/S structure software design.Then using Java language,adopting struts2+hibernate+spring framework combined with technology we realize the right management soft ware system,and applied the technology to the background management of the management system of seismic station of the Earthquake Administration of Yunnan Province.
B/S structure;database; rights management;access control list
TP302.1
A
1000-0666(2010)03-0349-05
2009-10-31.