趙秀霞+付秀麗
摘要: 權(quán)限組件讓組件具有自省性,組件能夠智能地判斷自己的表現(xiàn)形式,不需要依賴于業(yè)務(wù)程序自身的控制,使其自身的獨(dú)立性、重用性和易用性大大提高;權(quán)限攔截器則可以對(duì)訪問進(jìn)行統(tǒng)一攔截,統(tǒng)一判斷權(quán)限,并能夠根據(jù)需要隨意“插拔”。通過權(quán)限組件與權(quán)限攔截器的配合工作,程序開發(fā)人員可以完全專注于業(yè)務(wù)的開發(fā),無需意識(shí)到權(quán)限控制的存在。
關(guān)鍵詞: 權(quán)限設(shè)計(jì); 組件; 攔截器; AOP; Struts2
中圖分類號(hào): TN919?34; TP311.52; TP393.08 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2014)08?0105?03
Permission design and implementation of Web system based on subassembly and interceptor
ZHAO Xiu?xia, FU Xiu?li
(School of Mechanical Engineering, University of Jinan, Jinan 250014, China)
Abstract:Permission subassembly has introspection property, can intelligently determine its own form of expression, and does not depend on the control of business program, so its independence, reusability and usability are greatly increased. The permission interceptor can intercept access, judge rights of applicants, and be able to be free to "plug". By cooperation with the permission subassembly and interceptor, developers can fully concentrate their efforts on the development of the business program, but do not consider the access control.
Keywords: permission design; subassembly; interceptor; AOP; Struts2
從權(quán)限控制項(xiàng)目的角度,Web系統(tǒng)的權(quán)限控制內(nèi)容包括2部分:頁面組件顯示控制和請(qǐng)求攔截控制。只有同時(shí)控制這2個(gè)部分,才能真正做到完全的權(quán)限控制,并讓使用者有較好的操作體驗(yàn)。目前大部分的權(quán)限控制大多圍繞用戶角色進(jìn)行設(shè)計(jì),本文在這種角色管理的基礎(chǔ)上,提出了基于權(quán)限組件和權(quán)限攔截器的設(shè)計(jì)思想。現(xiàn)代軟件設(shè)計(jì)更講究解耦和重用,通過權(quán)限組件和權(quán)限攔截器,能夠讓權(quán)限控制獨(dú)立于業(yè)務(wù)程序之外,開發(fā)人員可以將精力完全投入業(yè)務(wù)功能的實(shí)現(xiàn),無需意識(shí)權(quán)限控制的存在。實(shí)際的權(quán)限控制,則是通過頁面組件本身的自省性,自動(dòng)根據(jù)訪問者的權(quán)限,表現(xiàn)出不同的形式(如顯示、不顯示、不可用等);同時(shí),由于Web系統(tǒng)自身的特點(diǎn),為了完全控制權(quán)限,還需要通過權(quán)限攔截器,對(duì)客戶端的請(qǐng)求進(jìn)行攔截,判斷訪問者是否具有訪問權(quán)限,決定是否允許訪問者繼續(xù)執(zhí)行當(dāng)前的請(qǐng)求。
1角色訪問控制
角色訪問控制作為一種經(jīng)典的權(quán)限解決方案[1],在Web開發(fā)中得到了廣泛的應(yīng)用。本文設(shè)計(jì)實(shí)現(xiàn)的權(quán)限組件與權(quán)限攔截器,在組件和攔截器內(nèi)部對(duì)訪問者權(quán)限進(jìn)行判斷時(shí),同樣也采用的是基于角色的訪問控制方式。所謂角色訪問控制,無非就是采用分而治之的思想,將用戶劃分為不同角色,比如:經(jīng)理、科長、職員等,再分別授予每種角色不同的權(quán)限,然后將全部用戶劃歸到不同的角色中去,當(dāng)用戶向系統(tǒng)發(fā)出請(qǐng)求時(shí),系統(tǒng)會(huì)首先查找出用戶所屬的角色,隨后再查找判斷該角色是否擁有所請(qǐng)求的資源的訪問權(quán)限,既而決定是否繼續(xù)執(zhí)行請(qǐng)求或是中止請(qǐng)求。圖1反映了這種訪問控制的處理過程。
2權(quán)限組件
對(duì)于Web開發(fā)來講,網(wǎng)頁的表現(xiàn)基本是通過HTML語言的代碼來詮釋的[2],然而HTML的各種標(biāo)簽,只提供了顯示功能,并不具備更高的可控性,為了實(shí)現(xiàn)權(quán)限組件,需要使用基于JEE實(shí)現(xiàn)的標(biāo)簽(Tag)來代替純粹的HTML標(biāo)簽,在其中通過增加權(quán)限判斷的處理,從而增加標(biāo)簽的自省特性,最終讓標(biāo)簽?zāi)軌蜃詣?dòng)根據(jù)訪問者的訪問權(quán)限來決定自己的表現(xiàn)形式。
圖1 訪問控制處理過程圖
本文通過給出一個(gè)權(quán)限按鈕的實(shí)現(xiàn)過程來具體說明如何實(shí)現(xiàn)權(quán)限組件。根據(jù)JEE的標(biāo)簽開發(fā)規(guī)范,首先需要實(shí)現(xiàn)一個(gè)標(biāo)簽類,并通過標(biāo)記庫描述文件對(duì)標(biāo)簽類進(jìn)行登記[3]。圖2是標(biāo)簽中權(quán)限判斷處理的流程圖。
圖2 標(biāo)簽中權(quán)限判斷處理的流程圖
對(duì)于需要根據(jù)權(quán)限判斷決定是否顯示的按鈕,只需要像下面那樣聲明一個(gè)按鈕標(biāo)簽,即可讓按鈕根據(jù)登錄用戶的權(quán)限來決定是否顯示自己。
以下是參考代碼:
<#?? 引入自定義標(biāo)簽庫 ??>
<#assign ipcat=JspTaglibs["/WEB?INF/tld/ipcat?tags.tld"]>
…
<#?? 使用自定義的權(quán)限按鈕 ??>
<@ipcat.button posturl="/customer/del" />
※ 這里使用的FreeMarker模板框架來渲染的表示層,同時(shí)Web層采用的是Struts2架構(gòu)。
通過實(shí)現(xiàn)權(quán)限組件,不僅可以讓組件自己決定是否顯示,而且提高了組件的重用性。任何需要進(jìn)行權(quán)限控制的頁面組件,均可以通過權(quán)限組件來生成出相應(yīng)的HTML標(biāo)簽代碼,當(dāng)然在生成之前必須通過權(quán)限組件的自省功能實(shí)現(xiàn)了權(quán)限控制,決定是否輸出實(shí)際的HTML代碼。
同樣的,可以將HTML的常用標(biāo)簽,如鏈接、Label、輸入框等都設(shè)計(jì)成JEE的標(biāo)簽,對(duì)于需要權(quán)限控制的HTML標(biāo)簽,直接使用自定義的標(biāo)簽就可以實(shí)現(xiàn)權(quán)限的自動(dòng)控制了;同時(shí),對(duì)于在線系統(tǒng)中最常見的“菜單”來說,也可以設(shè)計(jì)成自定義的標(biāo)簽,在其中進(jìn)行菜單項(xiàng)的權(quán)限控制,這樣就實(shí)現(xiàn)了可重用的具有權(quán)限判斷功能的菜單組件了,其本身可以根據(jù)登錄用戶的不同,自動(dòng)決定顯示哪些菜單項(xiàng)、哪些菜單不可用(如:灰色并且點(diǎn)擊無效)等特性。
3權(quán)限攔載器
不同于以往的C/S結(jié)構(gòu),在Web系統(tǒng)中,即使將按鈕或鏈接隱藏了,系統(tǒng)使用者依然可以通過在瀏覽器的地址欄中直接輸入地址的方式來訪問沒有顯式鏈接的頁面。這樣,就算隱藏了按鈕或鏈接也并不能徹底杜絕用戶對(duì)于一些有特殊限定的網(wǎng)頁的訪問。為了避免用戶通過地址欄輸入地址直接訪問系統(tǒng)想進(jìn)行權(quán)限限定的資源,就必須設(shè)法在用戶訪問到這些資源之前,對(duì)用戶進(jìn)行識(shí)別,只有擁有訪問權(quán)限的用戶才能繼續(xù)訪問,而對(duì)于沒有訪問權(quán)限的用戶就直接將頁面跳轉(zhuǎn)到非法請(qǐng)求頁面。
為了實(shí)現(xiàn)以上處理,本文引入AOP的概念來進(jìn)行說明權(quán)限攔截器的設(shè)計(jì)思路[4]。AOP是OOP的延續(xù),是Aspect Oriented Programming的縮寫,意思是面向切面編程[5]。
AOP實(shí)際是GoF設(shè)計(jì)模式的延續(xù),設(shè)計(jì)模式孜孜不倦追求的是調(diào)用者和被調(diào)用者之間的解耦,AOP可以說也是這種目標(biāo)的一種實(shí)現(xiàn)。在進(jìn)行權(quán)限設(shè)計(jì)時(shí),程序員在開發(fā)業(yè)務(wù)的過程中,為了限制系統(tǒng)訪問者的訪問,可能會(huì)將權(quán)限判斷處理加到業(yè)務(wù)處理的入口處,雖然可以將權(quán)限判斷的處理進(jìn)行封裝,但是這樣做依然還是避免不了將權(quán)限的控制與純粹的業(yè)務(wù)處理耦合在一起,不僅給維護(hù)帶來了復(fù)雜性,也給業(yè)務(wù)本身增加了不相關(guān)性。如果借助AOP的思想,將權(quán)限控制歸為一個(gè)切面,統(tǒng)一控制,讓權(quán)限控制徹底剝離到業(yè)務(wù)處理之外,這樣,程序員在開發(fā)的過程中,就可以完全專注于業(yè)務(wù)的開發(fā),而權(quán)限控制則可以由專注于權(quán)限業(yè)務(wù)的程序員來設(shè)計(jì)和實(shí)現(xiàn),并且可以根據(jù)客戶的需要,在實(shí)現(xiàn)的業(yè)務(wù)處理之外,通過配置的方式,靈活地設(shè)定各業(yè)務(wù)的權(quán)限范圍。圖3可以進(jìn)一步說明權(quán)限攔截器的設(shè)計(jì)思路。
請(qǐng)求A、B及C均想訪問同一業(yè)務(wù)處理,但是在他們到達(dá)業(yè)務(wù)處理之前,權(quán)限攔截器將對(duì)請(qǐng)求統(tǒng)一攔截,當(dāng)判斷請(qǐng)求A和B的用戶并不具有訪問權(quán)限時(shí),請(qǐng)求會(huì)直接轉(zhuǎn)向非法頁面呈現(xiàn)給客戶,而對(duì)于請(qǐng)求C的用戶由于通過了權(quán)限的驗(yàn)證,就可以有效地訪問到業(yè)務(wù)處理,并進(jìn)行相應(yīng)的數(shù)據(jù)處理了。為了實(shí)現(xiàn)對(duì)于權(quán)限的統(tǒng)一切面處理,本文結(jié)合Struts2的攔截器技術(shù),設(shè)計(jì)一個(gè)更加靈活的權(quán)限攔截器,不僅可以實(shí)現(xiàn)獨(dú)立于業(yè)務(wù)處理之外的權(quán)限控制,還可以讓權(quán)限控制做到可以任意“插拔”。
圖3 權(quán)限控制示意圖
攔截器(Interceptor)本身就是AOP思想的典型應(yīng)用,同時(shí)它也是Struts2的一個(gè)顯著特性,并且Struts2框架的大多數(shù)核心功能都是通過攔截器來實(shí)現(xiàn)的[6],像避免表單重復(fù)提交、對(duì)象組裝、驗(yàn)證、上傳文件等。通過使用攔截器,能將系統(tǒng)中可以分離的統(tǒng)一處理,全部從系統(tǒng)中解耦,而不是分散到業(yè)務(wù)處理中,這樣的功能類似于個(gè)人電腦的組裝,變成了可插拔,需要某個(gè)功能時(shí)就“插入”一個(gè)攔截器,不需要某個(gè)功能時(shí)就“拔出”這個(gè)攔截器。了解了AOP及Struts2中攔截器的概念后,就可以實(shí)現(xiàn)一個(gè)基于Struts2攔截器處理機(jī)制的權(quán)限攔截器,并將權(quán)限攔截器通過配置文件與業(yè)務(wù)處理組裝起來 (注意:不是通過程序固化在一起),這樣的權(quán)限攔截器是完全獨(dú)立于業(yè)務(wù)處理之外的權(quán)限控制,需要時(shí)就配置上,不需要時(shí)就不必配置。
當(dāng)然,在權(quán)限攔截器的權(quán)限判斷部分,和權(quán)限組件一樣,也是基于角色進(jìn)行判斷的,先從Session中得到用戶的角色,然后判斷該角色是否具有對(duì)正在請(qǐng)求的地址的訪問權(quán)限,從而決定是放行,還是直接轉(zhuǎn)向非法訪問的錯(cuò)誤提示頁面。很顯然,權(quán)限攔截器在實(shí)現(xiàn)了獨(dú)立于業(yè)務(wù)之外的權(quán)限控制功能之外,還具備可重用性,可以將權(quán)限攔截器反復(fù)“插入”到需要進(jìn)行權(quán)限控制的業(yè)務(wù)處理之前。
4結(jié)語
通過權(quán)限組件和權(quán)限攔截器,實(shí)現(xiàn)了業(yè)務(wù)邏輯與權(quán)限的解耦,讓權(quán)限完全獨(dú)立于純粹的業(yè)務(wù)功能之外,并且組件的重用性和攔截器的統(tǒng)一處理特性,都讓權(quán)限控制變得非常簡(jiǎn)單靈活,利用Struts2框架設(shè)計(jì)的權(quán)限攔截器更可以實(shí)現(xiàn)權(quán)限控制的任意“插拔”,這一切,都將使系統(tǒng)的開發(fā)、維護(hù)和擴(kuò)展也變得更加容易和輕松。
參考文獻(xiàn)
[1] 劉強(qiáng).基于角色的訪問控制技術(shù)[M].廣州:華南理工大學(xué)出版社,2010.
[2] Jon Duckett.Web編程入門經(jīng)典:HTML,XHTML和CSS[M].
2版.北京:清華大學(xué)出版社,2010.
[3] 鄒化,方衛(wèi)寧,鄒蓉.Servlet/JSP程序設(shè)計(jì)技術(shù)與實(shí)現(xiàn)[M].北京:人民郵電出版社,2001.
[4] WALLS Craig, BREIDENBACH Ryan. Spring in Action [M]. [S.l.]: Manning Publications, 2006.
[5] 吳煒煜.面向?qū)ο蠓治鲈O(shè)計(jì)與編程:OOA/OOD/OOP/AOP[M].
2版.北京:清華大學(xué)出版社,2007.
[6] 孫鑫.Struts 2 深入詳解[M].北京:電子工業(yè)出版社,2008.
AOP實(shí)際是GoF設(shè)計(jì)模式的延續(xù),設(shè)計(jì)模式孜孜不倦追求的是調(diào)用者和被調(diào)用者之間的解耦,AOP可以說也是這種目標(biāo)的一種實(shí)現(xiàn)。在進(jìn)行權(quán)限設(shè)計(jì)時(shí),程序員在開發(fā)業(yè)務(wù)的過程中,為了限制系統(tǒng)訪問者的訪問,可能會(huì)將權(quán)限判斷處理加到業(yè)務(wù)處理的入口處,雖然可以將權(quán)限判斷的處理進(jìn)行封裝,但是這樣做依然還是避免不了將權(quán)限的控制與純粹的業(yè)務(wù)處理耦合在一起,不僅給維護(hù)帶來了復(fù)雜性,也給業(yè)務(wù)本身增加了不相關(guān)性。如果借助AOP的思想,將權(quán)限控制歸為一個(gè)切面,統(tǒng)一控制,讓權(quán)限控制徹底剝離到業(yè)務(wù)處理之外,這樣,程序員在開發(fā)的過程中,就可以完全專注于業(yè)務(wù)的開發(fā),而權(quán)限控制則可以由專注于權(quán)限業(yè)務(wù)的程序員來設(shè)計(jì)和實(shí)現(xiàn),并且可以根據(jù)客戶的需要,在實(shí)現(xiàn)的業(yè)務(wù)處理之外,通過配置的方式,靈活地設(shè)定各業(yè)務(wù)的權(quán)限范圍。圖3可以進(jìn)一步說明權(quán)限攔截器的設(shè)計(jì)思路。
請(qǐng)求A、B及C均想訪問同一業(yè)務(wù)處理,但是在他們到達(dá)業(yè)務(wù)處理之前,權(quán)限攔截器將對(duì)請(qǐng)求統(tǒng)一攔截,當(dāng)判斷請(qǐng)求A和B的用戶并不具有訪問權(quán)限時(shí),請(qǐng)求會(huì)直接轉(zhuǎn)向非法頁面呈現(xiàn)給客戶,而對(duì)于請(qǐng)求C的用戶由于通過了權(quán)限的驗(yàn)證,就可以有效地訪問到業(yè)務(wù)處理,并進(jìn)行相應(yīng)的數(shù)據(jù)處理了。為了實(shí)現(xiàn)對(duì)于權(quán)限的統(tǒng)一切面處理,本文結(jié)合Struts2的攔截器技術(shù),設(shè)計(jì)一個(gè)更加靈活的權(quán)限攔截器,不僅可以實(shí)現(xiàn)獨(dú)立于業(yè)務(wù)處理之外的權(quán)限控制,還可以讓權(quán)限控制做到可以任意“插拔”。
圖3 權(quán)限控制示意圖
攔截器(Interceptor)本身就是AOP思想的典型應(yīng)用,同時(shí)它也是Struts2的一個(gè)顯著特性,并且Struts2框架的大多數(shù)核心功能都是通過攔截器來實(shí)現(xiàn)的[6],像避免表單重復(fù)提交、對(duì)象組裝、驗(yàn)證、上傳文件等。通過使用攔截器,能將系統(tǒng)中可以分離的統(tǒng)一處理,全部從系統(tǒng)中解耦,而不是分散到業(yè)務(wù)處理中,這樣的功能類似于個(gè)人電腦的組裝,變成了可插拔,需要某個(gè)功能時(shí)就“插入”一個(gè)攔截器,不需要某個(gè)功能時(shí)就“拔出”這個(gè)攔截器。了解了AOP及Struts2中攔截器的概念后,就可以實(shí)現(xiàn)一個(gè)基于Struts2攔截器處理機(jī)制的權(quán)限攔截器,并將權(quán)限攔截器通過配置文件與業(yè)務(wù)處理組裝起來 (注意:不是通過程序固化在一起),這樣的權(quán)限攔截器是完全獨(dú)立于業(yè)務(wù)處理之外的權(quán)限控制,需要時(shí)就配置上,不需要時(shí)就不必配置。
當(dāng)然,在權(quán)限攔截器的權(quán)限判斷部分,和權(quán)限組件一樣,也是基于角色進(jìn)行判斷的,先從Session中得到用戶的角色,然后判斷該角色是否具有對(duì)正在請(qǐng)求的地址的訪問權(quán)限,從而決定是放行,還是直接轉(zhuǎn)向非法訪問的錯(cuò)誤提示頁面。很顯然,權(quán)限攔截器在實(shí)現(xiàn)了獨(dú)立于業(yè)務(wù)之外的權(quán)限控制功能之外,還具備可重用性,可以將權(quán)限攔截器反復(fù)“插入”到需要進(jìn)行權(quán)限控制的業(yè)務(wù)處理之前。
4結(jié)語
通過權(quán)限組件和權(quán)限攔截器,實(shí)現(xiàn)了業(yè)務(wù)邏輯與權(quán)限的解耦,讓權(quán)限完全獨(dú)立于純粹的業(yè)務(wù)功能之外,并且組件的重用性和攔截器的統(tǒng)一處理特性,都讓權(quán)限控制變得非常簡(jiǎn)單靈活,利用Struts2框架設(shè)計(jì)的權(quán)限攔截器更可以實(shí)現(xiàn)權(quán)限控制的任意“插拔”,這一切,都將使系統(tǒng)的開發(fā)、維護(hù)和擴(kuò)展也變得更加容易和輕松。
參考文獻(xiàn)
[1] 劉強(qiáng).基于角色的訪問控制技術(shù)[M].廣州:華南理工大學(xué)出版社,2010.
[2] Jon Duckett.Web編程入門經(jīng)典:HTML,XHTML和CSS[M].
2版.北京:清華大學(xué)出版社,2010.
[3] 鄒化,方衛(wèi)寧,鄒蓉.Servlet/JSP程序設(shè)計(jì)技術(shù)與實(shí)現(xiàn)[M].北京:人民郵電出版社,2001.
[4] WALLS Craig, BREIDENBACH Ryan. Spring in Action [M]. [S.l.]: Manning Publications, 2006.
[5] 吳煒煜.面向?qū)ο蠓治鲈O(shè)計(jì)與編程:OOA/OOD/OOP/AOP[M].
2版.北京:清華大學(xué)出版社,2007.
[6] 孫鑫.Struts 2 深入詳解[M].北京:電子工業(yè)出版社,2008.
AOP實(shí)際是GoF設(shè)計(jì)模式的延續(xù),設(shè)計(jì)模式孜孜不倦追求的是調(diào)用者和被調(diào)用者之間的解耦,AOP可以說也是這種目標(biāo)的一種實(shí)現(xiàn)。在進(jìn)行權(quán)限設(shè)計(jì)時(shí),程序員在開發(fā)業(yè)務(wù)的過程中,為了限制系統(tǒng)訪問者的訪問,可能會(huì)將權(quán)限判斷處理加到業(yè)務(wù)處理的入口處,雖然可以將權(quán)限判斷的處理進(jìn)行封裝,但是這樣做依然還是避免不了將權(quán)限的控制與純粹的業(yè)務(wù)處理耦合在一起,不僅給維護(hù)帶來了復(fù)雜性,也給業(yè)務(wù)本身增加了不相關(guān)性。如果借助AOP的思想,將權(quán)限控制歸為一個(gè)切面,統(tǒng)一控制,讓權(quán)限控制徹底剝離到業(yè)務(wù)處理之外,這樣,程序員在開發(fā)的過程中,就可以完全專注于業(yè)務(wù)的開發(fā),而權(quán)限控制則可以由專注于權(quán)限業(yè)務(wù)的程序員來設(shè)計(jì)和實(shí)現(xiàn),并且可以根據(jù)客戶的需要,在實(shí)現(xiàn)的業(yè)務(wù)處理之外,通過配置的方式,靈活地設(shè)定各業(yè)務(wù)的權(quán)限范圍。圖3可以進(jìn)一步說明權(quán)限攔截器的設(shè)計(jì)思路。
請(qǐng)求A、B及C均想訪問同一業(yè)務(wù)處理,但是在他們到達(dá)業(yè)務(wù)處理之前,權(quán)限攔截器將對(duì)請(qǐng)求統(tǒng)一攔截,當(dāng)判斷請(qǐng)求A和B的用戶并不具有訪問權(quán)限時(shí),請(qǐng)求會(huì)直接轉(zhuǎn)向非法頁面呈現(xiàn)給客戶,而對(duì)于請(qǐng)求C的用戶由于通過了權(quán)限的驗(yàn)證,就可以有效地訪問到業(yè)務(wù)處理,并進(jìn)行相應(yīng)的數(shù)據(jù)處理了。為了實(shí)現(xiàn)對(duì)于權(quán)限的統(tǒng)一切面處理,本文結(jié)合Struts2的攔截器技術(shù),設(shè)計(jì)一個(gè)更加靈活的權(quán)限攔截器,不僅可以實(shí)現(xiàn)獨(dú)立于業(yè)務(wù)處理之外的權(quán)限控制,還可以讓權(quán)限控制做到可以任意“插拔”。
圖3 權(quán)限控制示意圖
攔截器(Interceptor)本身就是AOP思想的典型應(yīng)用,同時(shí)它也是Struts2的一個(gè)顯著特性,并且Struts2框架的大多數(shù)核心功能都是通過攔截器來實(shí)現(xiàn)的[6],像避免表單重復(fù)提交、對(duì)象組裝、驗(yàn)證、上傳文件等。通過使用攔截器,能將系統(tǒng)中可以分離的統(tǒng)一處理,全部從系統(tǒng)中解耦,而不是分散到業(yè)務(wù)處理中,這樣的功能類似于個(gè)人電腦的組裝,變成了可插拔,需要某個(gè)功能時(shí)就“插入”一個(gè)攔截器,不需要某個(gè)功能時(shí)就“拔出”這個(gè)攔截器。了解了AOP及Struts2中攔截器的概念后,就可以實(shí)現(xiàn)一個(gè)基于Struts2攔截器處理機(jī)制的權(quán)限攔截器,并將權(quán)限攔截器通過配置文件與業(yè)務(wù)處理組裝起來 (注意:不是通過程序固化在一起),這樣的權(quán)限攔截器是完全獨(dú)立于業(yè)務(wù)處理之外的權(quán)限控制,需要時(shí)就配置上,不需要時(shí)就不必配置。
當(dāng)然,在權(quán)限攔截器的權(quán)限判斷部分,和權(quán)限組件一樣,也是基于角色進(jìn)行判斷的,先從Session中得到用戶的角色,然后判斷該角色是否具有對(duì)正在請(qǐng)求的地址的訪問權(quán)限,從而決定是放行,還是直接轉(zhuǎn)向非法訪問的錯(cuò)誤提示頁面。很顯然,權(quán)限攔截器在實(shí)現(xiàn)了獨(dú)立于業(yè)務(wù)之外的權(quán)限控制功能之外,還具備可重用性,可以將權(quán)限攔截器反復(fù)“插入”到需要進(jìn)行權(quán)限控制的業(yè)務(wù)處理之前。
4結(jié)語
通過權(quán)限組件和權(quán)限攔截器,實(shí)現(xiàn)了業(yè)務(wù)邏輯與權(quán)限的解耦,讓權(quán)限完全獨(dú)立于純粹的業(yè)務(wù)功能之外,并且組件的重用性和攔截器的統(tǒng)一處理特性,都讓權(quán)限控制變得非常簡(jiǎn)單靈活,利用Struts2框架設(shè)計(jì)的權(quán)限攔截器更可以實(shí)現(xiàn)權(quán)限控制的任意“插拔”,這一切,都將使系統(tǒng)的開發(fā)、維護(hù)和擴(kuò)展也變得更加容易和輕松。
參考文獻(xiàn)
[1] 劉強(qiáng).基于角色的訪問控制技術(shù)[M].廣州:華南理工大學(xué)出版社,2010.
[2] Jon Duckett.Web編程入門經(jīng)典:HTML,XHTML和CSS[M].
2版.北京:清華大學(xué)出版社,2010.
[3] 鄒化,方衛(wèi)寧,鄒蓉.Servlet/JSP程序設(shè)計(jì)技術(shù)與實(shí)現(xiàn)[M].北京:人民郵電出版社,2001.
[4] WALLS Craig, BREIDENBACH Ryan. Spring in Action [M]. [S.l.]: Manning Publications, 2006.
[5] 吳煒煜.面向?qū)ο蠓治鲈O(shè)計(jì)與編程:OOA/OOD/OOP/AOP[M].
2版.北京:清華大學(xué)出版社,2007.
[6] 孫鑫.Struts 2 深入詳解[M].北京:電子工業(yè)出版社,2008.