張國(guó)平,馬 麗
(平頂山學(xué)院 軟件學(xué)院,河南 平頂山 467000)
隨著計(jì)算機(jī)技術(shù)和網(wǎng)絡(luò)技術(shù)的不斷發(fā)展,企業(yè)級(jí)應(yīng)用不斷走向成熟,J2EE平臺(tái)也越來越受人們關(guān)注,但隨著Web應(yīng)用的不斷復(fù)雜化,單純使用J2EE提供的基本組件很難滿足用戶的需求,同時(shí)開發(fā)難度也比較大[1],為了降低J2EE開發(fā)難度,在Web系統(tǒng)中引入一個(gè)容器框架Spring來輔助開發(fā),該框架中的IoC技術(shù)和AOP技術(shù)可以將應(yīng)用程序代碼中硬編碼邏輯剝離出來放到配置文件中從而提高應(yīng)用的可維護(hù)性和組件之間的耦合度[2-3]。
然而,Spring框架并沒有提供對(duì)企業(yè)級(jí)應(yīng)用系統(tǒng)安全性的支持,Acegi是基于Spring的一個(gè)開源的安全認(rèn)證框架,本文對(duì)Spring框架集成Acegi安全框架進(jìn)行了深入的探討,同時(shí)給出了具體的實(shí)現(xiàn)方法,從而提高了應(yīng)用系統(tǒng)的靈活性,安全性,以滿足不同企業(yè)的安全需求。
Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn) (IoC)和面向切面(AOP)的開源容器框架,它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情[4-5]。然而,Spring的用途不僅限于服務(wù)器端的開發(fā)。同時(shí)可以使你能夠編寫更干凈、更可管理、并且更易于測(cè)試的代碼,并提供了對(duì)其它框架的支持[6]。
Acegi是一個(gè)基于Spring Framework的安全框架,它能夠與當(dāng)前流行的Web容器無縫集成[7]。它結(jié)合Spring框架為Web系統(tǒng)提供安全和認(rèn)證安全服務(wù),包括使用攔截器、Bean Context和面向接口的編程方式。因此,Acegi安全系統(tǒng)能夠輕松地適用于復(fù)雜的安全需求。為了實(shí)現(xiàn)對(duì)Web服務(wù)的保護(hù),Acegi框架提供了以下8個(gè)關(guān)鍵功能組件:
1)Authentication 對(duì)象,包含了 Principal,Credential和 Principal的授權(quán)信息。同時(shí)還可以包含關(guān)于發(fā)起認(rèn)證請(qǐng)求的客戶的其他信息,如IP地址。
2)ContextHolder對(duì)象,使用ThreadLocal儲(chǔ)存 Authentication對(duì)象的地方。
3)AuthenticationManager, 用于認(rèn)證 ContextHolder中的Authentication對(duì)象。
4)AccessDecissionManager,用于授權(quán)一個(gè)特定的操作。
5)RunAsManager,當(dāng)執(zhí)行特定的操作時(shí),用于選擇性地替換Authentication對(duì)象。
6)Secure Object攔截器,用于協(xié)調(diào) AuthenticationManager,AccessDecissionManager,RunAsManager和特定操作的執(zhí)行。
7)AfterInvocationManager, 用于在 一個(gè) SesureObject運(yùn)行結(jié)束后修改一個(gè)對(duì)象,比如從 Principal的 authorities集合中移除一些沒有訪問授權(quán)的元素.
8)AfterInvocationManager, 用于在 一個(gè) SesureObject運(yùn)行結(jié)束后修改一個(gè)對(duì)象,比如從 Principal的 authorities集合中移除一些沒有訪問授權(quán)的元素。
在當(dāng)前大多數(shù)的企業(yè)級(jí)應(yīng)用中通常有如下4種基本的安全需求:1)需要對(duì)服務(wù)層方法進(jìn)行保護(hù);2)需要對(duì)主體進(jìn)行鑒別;3)需要對(duì)web請(qǐng)求進(jìn)行保護(hù);4)需要對(duì)域?qū)ο髮?shí)例進(jìn)行保護(hù)。Acegi提供了一個(gè)通用的框架,它可以滿足上述4種企業(yè)安全級(jí)的需求。下面以Acegi在Web應(yīng)用程序中應(yīng)用為例,它所能做的工作包括以下幾個(gè)方面:
①在用戶訪問受保護(hù)資源之前提示用戶登錄;②鑒別用戶是否是系統(tǒng)的合法用戶;③鑒別合法用戶是否具有訪問受保護(hù)資源的權(quán)限;④通過認(rèn)證并對(duì)已授權(quán)的用戶導(dǎo)向相應(yīng)的受保護(hù)的資源;⑤當(dāng)認(rèn)證用戶成功登陸系統(tǒng)后,Acegi會(huì)在服務(wù)器端表示該用戶已通過認(rèn)證,并且在客戶端放置一個(gè)安全Cookie,這樣,系統(tǒng)的下一個(gè)認(rèn)證過程就可以直接使用該Cookie;⑥用戶注銷或退出系統(tǒng)的時(shí)候,Acegi負(fù)責(zé)銷毀服務(wù)器端保存的Session;⑦Acegi負(fù)責(zé)與不同的數(shù)據(jù)源交互,以完成對(duì)用戶信息的認(rèn)證功能。
在Web工程項(xiàng)目中使用Spring和Acegi安全框架,首先要將Spring、Acegi相應(yīng)的JAR包下載(可以到相應(yīng)的官方網(wǎng)站下載),然后導(dǎo)入到工程中。這樣當(dāng)前項(xiàng)目就具備了上述兩種安全框架的環(huán)境,接下來配置web.xml,該文件用來初始化工程信息的。并將Sping的Ioc容器裝載到ServletContext中,并且配置FilterToBeanProxv過濾器。接下來配置Spring的配置文件applicationcontext.xml文件,最后部署并運(yùn)行項(xiàng)目即可。下面以畢業(yè)設(shè)計(jì)選題系統(tǒng)為例,用Spring和Acegi實(shí)現(xiàn)系統(tǒng)的安全與登陸。通過分析得出該系統(tǒng)分為:管理員,教師,學(xué)生3種角色,在用戶界面中可以實(shí)現(xiàn)上述3種用戶的登錄,要求登陸在一個(gè)界面下自動(dòng)識(shí)別,而無需進(jìn)行身份選擇,登陸后,他們將分別到各自的跳轉(zhuǎn)頁(yè)面。具體的實(shí)現(xiàn)步驟如下:
首先修改web.xml,增加安全控制過濾鏈:
在上述代碼中可以看出Acegi實(shí)現(xiàn)了Filter接口的FilterToBeanProxy提供一種特殊的使用Filter的方式,它委托Spring中的Bean-FilterChainProxy來完成過濾功能,這樣可以簡(jiǎn)化web.xml的配置,并且利用Spring IOC的優(yōu)勢(shì)。FilterChainProxy包含了處理認(rèn)證過程的filter列表,每個(gè)filter都有各自的功能。
接下來在 applicationContext.xml中增加 Acegi安全控制攔截器和Spring的自動(dòng)代理功能實(shí)現(xiàn)AOP代理代碼配置如下:
Acegi安全框架為企業(yè)級(jí)軟件開發(fā)提供了一個(gè)強(qiáng)有力的、靈活的解決方案,是目前開源社區(qū)最好安全框架之一。由于Spring框架在越來越多的項(xiàng)目中應(yīng)用,并且該框架本身沒有提供對(duì)系統(tǒng)安全方面的支持。因此基于Spring應(yīng)用的Acegi安全框架的研究就顯得非常重要,對(duì)安全框架的使用過程中不需要改變?cè)邢到y(tǒng)的任何代碼,只需要通過配置文件引入即可,真正實(shí)現(xiàn)了將安全代碼從業(yè)務(wù)代碼中分離。使得業(yè)務(wù)代碼更干凈,系統(tǒng)結(jié)構(gòu)更合理。
[1]王爽.基于ASSH框架的運(yùn)動(dòng)會(huì)信息管理系統(tǒng)設(shè)計(jì)[J].電子設(shè)計(jì)工程,2011(10):31-34.
WANG Shuang.Design of games information management system based on ASSH framework[J].Electronic Design Engineering,2011(10):31-34.
[2]劉偉,馮偉.基于SSH和Acegi的Web應(yīng)用框架的設(shè)計(jì)與實(shí)現(xiàn)[J].軟件導(dǎo)刊,2011(7):122-124.
LIU Wei,F(xiàn)ENG Wei.Design and implementation of Web application framework based on the SSH and Acegi[J].Software Guide,2011(7):122-124.
[3]張齊,余磊.基于J2EE平臺(tái)的可配置權(quán)限系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].信息通訊技術(shù),2008(6):31-36.
ZHANG Qi,YU Lei.The design and implementation of configurable privilege management system based on J2EE platform[J].Information and Communications Technologies,2008(6):31-36.
[4]肖杰,陳翔,何海江.基于AJAX和Struts的Web應(yīng)用的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2009(8):1934-1938.
XIAO Jie,CHEN Xiang,HE Hai-jiang.Design and implementation of web application based on AJAX and struts[J].Computer Engineering and Design,2009(8):1934-1938.
[5]傅鸝,殷旻昊.基于Struts+Spring+Hibernate+Ajax技術(shù)的科研管理系統(tǒng)設(shè)計(jì)[J].軟件導(dǎo)刊,2009(1):134-136.
FU Li,YIN Min-hao.Design of science research management system based on Struts+Spring+Hibernate+Ajax technology[J].Software Guide,2009(1):134-136.
[6]諶湘倩,狄文輝,孫冬.基于SSH框架與AJAX技術(shù)的Java Web應(yīng)用開發(fā)[J].計(jì)算機(jī)工程與設(shè)計(jì),2009,10:2590-2592.
CHEN Xiang-qian,DI Wen-hui,SUN Dong.Application of Java web based on SSH and AJAX[J].Computer Engineering and Design,2009(10):2590-2592.
[7]馬 林,黃文培.RBAC的權(quán)限擴(kuò)展和其在Acegi下的實(shí)現(xiàn)?[J].微計(jì)算機(jī)信息,2008(6):34-36.
MA Lin,HUANG Wen-pei.Extended model based on RBAC and its implementation on acegi framework[J].Microcomputer Information,2008(6):34-36.