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