單婧婧
(東方電子股份有限公司,山東 煙臺(tái) 264000)
隨著電網(wǎng)業(yè)務(wù)及信息化的不斷發(fā)展,越來(lái)越多的B/S模式系統(tǒng)被開(kāi)發(fā)并部署于III/IV區(qū),該類系統(tǒng)不需要客戶端安裝任何軟件,通過(guò)瀏覽器即可使用系統(tǒng),簡(jiǎn)單方便。與此同時(shí),系統(tǒng)對(duì)信息安全提出了更高的要求,因此需要一系列安全手段來(lái)保證系統(tǒng)信息的機(jī)密性、可靠性和完整性[1]。該類系統(tǒng)需求變化頻繁,如果對(duì)權(quán)限的控制每次都要開(kāi)發(fā)對(duì)應(yīng)的授權(quán)功能,且要改動(dòng)已有業(yè)務(wù)代碼,則費(fèi)時(shí)費(fèi)力,且會(huì)大大降低開(kāi)發(fā)效率。因此需要研究并開(kāi)發(fā)一套通用的權(quán)限控制機(jī)制,當(dāng)用戶系統(tǒng)權(quán)限需求變更后,通過(guò)統(tǒng)一權(quán)限管理界面配置后,只需修改少量業(yè)務(wù)代碼,即可完成用戶的業(yè)務(wù)相關(guān)權(quán)限控制。
目前比較成熟的權(quán)限管理系統(tǒng)大都是基于角色的訪問(wèn)控制,即RBAC(Role-based Access Control)[2-4],該機(jī)制主要包含角色、用戶和資源對(duì)象三大部分。其中資源對(duì)象可理解為需要權(quán)限控制的對(duì)象,比如系統(tǒng)功能菜單、按鈕等,這類資源的訪問(wèn)控制與角色關(guān)聯(lián),特定角色訪問(wèn)特定資源,而用戶可以分配角色,從而使用戶具備了訪問(wèn)對(duì)應(yīng)資源的權(quán)限[5]。一個(gè)用戶可以擁有多個(gè)角色,同樣一個(gè)角色可以分配給多個(gè)用戶?;谠撍枷耄呀?jīng)開(kāi)發(fā)實(shí)現(xiàn)了基本的權(quán)限管理功能,能夠?qū)?yè)面菜單以及頁(yè)面內(nèi)的按鈕進(jìn)行控制。
根據(jù)功能需求,設(shè)計(jì)需要授權(quán)的業(yè)務(wù)對(duì)象類型表、業(yè)務(wù)對(duì)象數(shù)據(jù)源表、記錄授權(quán)結(jié)果的業(yè)務(wù)對(duì)象授權(quán)表。①業(yè)務(wù)對(duì)象類型表。用于記錄要授權(quán)的對(duì)象類型描述及結(jié)構(gòu),如子控制區(qū)域、SVG圖形、供電所、變電站、責(zé)任區(qū)等。TYPE:業(yè)務(wù)對(duì)象類型代碼,如2,5,6,7,10。NAME:業(yè)務(wù)對(duì)象名稱,與代碼對(duì)應(yīng),如SVG圖、變電站、責(zé)任區(qū)、CIM樹(shù)等。FLAG:當(dāng)對(duì)象全部未授權(quán)時(shí),默認(rèn)有訪問(wèn)權(quán)限設(shè)置1,默認(rèn)無(wú)訪問(wèn)權(quán)限設(shè)置為0。ISTREE:是否為樹(shù)形結(jié)構(gòu),1:是,0:否。SELECT_MODE:樹(shù)節(jié)點(diǎn)選擇方式,只針對(duì)樹(shù)形結(jié)構(gòu)起作用。1:子節(jié)點(diǎn)選中時(shí)父節(jié)點(diǎn)自動(dòng)選中;父節(jié)點(diǎn)選中時(shí)子節(jié)點(diǎn)不自動(dòng)選中;2:父節(jié)點(diǎn)選中時(shí)子節(jié)點(diǎn)自動(dòng)全選中,子節(jié)點(diǎn)選中時(shí),父節(jié)點(diǎn)不自動(dòng)選中;3:父子級(jí)聯(lián)選中,父節(jié)點(diǎn)選中自動(dòng)選中子節(jié)點(diǎn),子節(jié)點(diǎn)選中也自動(dòng)選中父節(jié)點(diǎn);4:多選,父子無(wú)關(guān)聯(lián);5:?jiǎn)芜x。REMARK:備注信息。②業(yè)務(wù)對(duì)象數(shù)據(jù)源表。用于存放需要進(jìn)行授權(quán)的各類型業(yè)務(wù)對(duì)象數(shù)據(jù)源,如子控制區(qū)域數(shù)據(jù),各類變電站,責(zé)任區(qū)等。③業(yè)務(wù)對(duì)象授權(quán)結(jié)果表。用于記錄角色與控制對(duì)象授權(quán)結(jié)果。另外,還有系統(tǒng)原有的角色表、用戶表、角色用戶關(guān)系表。
要實(shí)現(xiàn)對(duì)業(yè)務(wù)對(duì)象的權(quán)限控制,需要三個(gè)步驟:數(shù)據(jù)準(zhǔn)備、界面授權(quán)、業(yè)務(wù)控制。
(1)數(shù)據(jù)準(zhǔn)備。系統(tǒng)初始化時(shí),根據(jù)實(shí)際應(yīng)用,初始化業(yè)務(wù)對(duì)象類型表數(shù)據(jù);基于業(yè)務(wù)對(duì)象類型,將各類型對(duì)應(yīng)的業(yè)務(wù)對(duì)象數(shù)據(jù)插入到業(yè)務(wù)對(duì)象數(shù)據(jù)源表中,可手工插入,或者編寫(xiě)sql(從現(xiàn)有表中抽取數(shù)據(jù))自動(dòng)執(zhí)行插入,因?yàn)樯婕暗皆磾?shù)據(jù)更新問(wèn)題,推薦sql方式插入。
(2)界面授權(quán)。數(shù)據(jù)設(shè)置完成后,到界面進(jìn)行授權(quán)。根據(jù)角色,選擇業(yè)務(wù)對(duì)象類型,自動(dòng)顯示對(duì)應(yīng)源數(shù)據(jù),根據(jù)業(yè)務(wù)需要,從源數(shù)據(jù)中選擇可訪問(wèn)的內(nèi)容進(jìn)行授權(quán)。
(3)業(yè)務(wù)應(yīng)用。各個(gè)業(yè)務(wù)模塊實(shí)現(xiàn)中,對(duì)于有權(quán)限要求的業(yè)務(wù)對(duì)象數(shù)據(jù)調(diào)用統(tǒng)一權(quán)限訪問(wèn)接口,獲取當(dāng)前登陸人員對(duì)應(yīng)權(quán)限,控制數(shù)據(jù)顯示,如對(duì)于子控制區(qū),只顯示用戶可訪問(wèn)的子控制區(qū)列表,或者判斷是否有權(quán)限操作某子控制區(qū)。
通用業(yè)務(wù)授權(quán)系統(tǒng)部署在Tomcat服務(wù)器,實(shí)現(xiàn)使用eclipse開(kāi)發(fā)工具,基于Spring+iBatis+DWR+Ext整合框架進(jìn)行開(kāi)發(fā),數(shù)據(jù)庫(kù)采用Oracle。
Spring是一個(gè)廣為流行的開(kāi)源的Java應(yīng)用程序開(kāi)發(fā)框架,是為解決企業(yè)應(yīng)用程序開(kāi)發(fā)復(fù)雜性而創(chuàng)建的輕量級(jí)、一站式解決方案。通過(guò)依賴注入模式,將依賴關(guān)系從編碼中脫離出來(lái),可以用簡(jiǎn)單的組件組裝復(fù)雜的應(yīng)用,同時(shí),大大降低了組件之間的耦合,極大地改善了代碼的可重用性,實(shí)現(xiàn)了組件真正意義上的即插即用。
iBatis是一個(gè)O/R Mapping解決方案,實(shí)現(xiàn)了POJO(Plain Ordinary Java Objects,即簡(jiǎn)單的普通Java對(duì)象)與關(guān)系庫(kù)SQL之間的映射。通過(guò)iBatis,可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)表與代碼之間的松耦合。
DWR(Direct Web Remoting)是一個(gè)WEB遠(yuǎn)程調(diào)用框架,根據(jù)Java類來(lái)動(dòng)態(tài)生成JavaScrip代碼,利用這個(gè)框架,可以在客戶端利用JavaScript直接調(diào)用服務(wù)端的Java方法并將返回值給前臺(tái)JS,就好像直接在客戶端本地調(diào)用一樣。
ExtJS是一個(gè)Javascript編寫(xiě)的用于創(chuàng)建前臺(tái)用戶界面的AJAX框架,提供了RIA開(kāi)發(fā)所需的所有常用界面組件。通過(guò)ExtJS,可以快速、輕松地創(chuàng)建豐富多彩的客戶端應(yīng)用,并大大降低開(kāi)發(fā)的前臺(tái)工作量。
進(jìn)入系統(tǒng)角色管理界面,選擇角色,點(diǎn)擊工具按鈕進(jìn)入應(yīng)用授權(quán)窗口。在窗口中選擇業(yè)務(wù)對(duì)象類型,根據(jù)類型表判斷使用列表還是樹(shù)形結(jié)構(gòu)顯示源數(shù)據(jù)。根據(jù)業(yè)務(wù)需要,選擇對(duì)應(yīng)角色有權(quán)限的業(yè)務(wù)對(duì)象添加到權(quán)限列表中,點(diǎn)擊確定完成授權(quán),擁有該角色的用戶登陸系統(tǒng)后即可訪問(wèn)所授權(quán)的業(yè)務(wù)對(duì)象。
系統(tǒng)封裝多個(gè)DWR接口,供業(yè)務(wù)模塊調(diào)用,開(kāi)發(fā)人員可根據(jù)實(shí)際權(quán)限需求,調(diào)用對(duì)應(yīng)接口獲取權(quán)限控制信息,下面列出幾個(gè)典型接口描述:
(1)獲取當(dāng)前用戶可訪問(wèn)的應(yīng)用列表
輸入:應(yīng)用類型或應(yīng)用類型_層級(jí),字符串格式,如5。
輸出:當(dāng)前登錄人員可訪問(wèn)的對(duì)象列表,對(duì)象數(shù)據(jù)格式。
(2)獲取某個(gè)用戶可訪問(wèn)的應(yīng)用列表
輸入:用戶代碼,字符串格式,應(yīng)用類型或應(yīng)用類型_層級(jí),字符串格式。
輸出:用戶可訪問(wèn)的對(duì)象列表,對(duì)象數(shù)據(jù)格式。
(3)檢查某用戶是否有權(quán)限訪問(wèn)某應(yīng)用
輸入:用戶代碼,字符串格式。
業(yè)務(wù)對(duì)象類型,字符串格式。
業(yè)務(wù)對(duì)象代碼,字符串格式。
輸出:true/false。
本文在已有權(quán)限系統(tǒng)基礎(chǔ)上,結(jié)合業(yè)務(wù)實(shí)際需求,開(kāi)發(fā)一套通用的業(yè)務(wù)對(duì)象授權(quán)系統(tǒng),解決現(xiàn)有電網(wǎng)業(yè)務(wù)中如子控制區(qū)域、變電站等多種業(yè)務(wù)對(duì)象權(quán)限控制需求。該系統(tǒng)同樣適用于其他WEB權(quán)限業(yè)務(wù)相關(guān)權(quán)限管理,具有較高的推廣性。目前業(yè)務(wù)對(duì)象源數(shù)據(jù)通過(guò)人工或sql方式維護(hù),下一步考慮實(shí)現(xiàn)源數(shù)據(jù)維護(hù)界面,加強(qiáng)其通用性。