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