周平,杜海舟,張超
(上海電力學院計算機與信息工程學院,上海 200090)
Java EE框架日益成熟,為企業的開發應用提供了良好服務和支持.隨著基于Java EE平臺企業級應用程序的日益增加,如何保證Web應用程序安全[1]是信息系統架構師與開發人員亟待解決的重要問題之一.
Acegi可以為企業應用提供強大而靈活的安全訪問控制解決方案.Acegi又稱為Spring Security,是基于Spring Framework[2]的安全框架,能夠和目前主流的Web容器無縫集成.Acegi充分利用Spring的IoC(Inversion of Control)和AOP (Aspect Oriented Programming)功能,提供聲明式安全訪問控制的功能[3].
通過對Acegi精心配置和編程就可以實現復雜的安全需求.本文主要研究了如何使用Acegi對應用程序實現安全訪問控制,以上海市研究生學術網站為例,設計并實現了一個基于Acegi的安全應用系統,并驗證了Acegi框架對保護Web應用程序安全、有效、可行.
針對應用程序Acegi提供了3個方面的安全控制策略,可以實現業務對象方法級的安全訪問控制粒度.
(1)對URL資源的訪問控制URL資源包括JSP頁面、Servlet,以及網站圖片等.客戶端向Web服務器發送一個URL請求,這個請求首先被Acegi的Servlet過濾器攔截.Acegi從配置文件或Web上下文中讀取該用戶的信息(可以是匿名用戶),判斷用戶是否有權訪問目標資源.授權者允許訪問,而未授權者將被拒絕.同時將認證成功的用戶名、密碼、授權等信息存到Acegi的上下文容器中,目的是為了以后對資源訪問驗證授權時可以直接從Acegi容器中獲取此用戶的所有授權.在配置文件中定義用戶授權訪問的一些URL資源路徑時,可使用正則表達式.
(2)對業務類的訪問控制業務類即Java Bean或Bean,可實現業務的邏輯功能,包含增加、刪除、查詢用戶等方法.在調用Bean所有方法前,Acegi將檢查用戶的訪問控制列表ACL(Aeccess Control List),查看其是否包含正要進行操作的Bean對象,只有Bean對象被授權時,程序才可以調用該對象中的方法.因此,可通過在數據庫中定義用戶授權調用Bean類的方法來控制對業務類的訪問.
(3)對Bean方法的訪問控制Bean方法訪問控制比Bean訪問控制粒度更小,前者是對Bean中所有方法進行控制,后者是在未對Bean訪問控制下對Bean中的部分方法進行控制.我們對用戶管理Bean增加和刪除用戶的方法進行控制,而查詢方法不受控制.當用戶的請求引發調用Bean的受控方法時,Acegi通過Spring AOP[4]對容器中Bean的受控方法進行攔截,阻止未授權者的調用.Spring容器中所有Bean的方法都可以被Acegi管理.
Acegi安全框架主要由過濾器、管理器、提供者和處理程序等4種主要類型的組件組成[5].
(1)過濾器是處在Acegi最高級的組件.當用戶請求服務器資源時,首先被Acegi過濾器攔截進行安全認證,但過濾器本身并沒有實現這些安全服務,而是將用戶信息提交給安全認證的管理器處理.
(2)管理器作為管理者,它本身不提供安全服務,但可以依據配置文件的不同調度相應的安全提供者程序.Acegi的管理器將在運行時選擇合適的提供者.
(3)提供者主要提供較低級的安全服務.提供者與不同類型的數據通信,并提供用戶的身份驗證信息,如從數據庫或配置文件里讀出用戶名和密碼,在用戶的Cookie里讀出身份信息或在Session里讀出身份驗證信息,獲取這些信息后進行安全驗證.
(4)處理程序供提供者程序調用,如會話無效處理程序、刪除用戶的Cookie處理程序等.
Web應用程序系統的安全一般由認證和授權兩個方面構成[6].認證是確認用戶的身份.在Acegi安全系統中,需要被認證的用戶、系統或代理稱為“Principal”.授權是應用程序決定用戶訪問Web內容的方法.總的來說,決定用戶的授權需要先對用戶進行身份驗證.通過驗證后,就可以使用安全服務或由安全服務來決定用戶的授權.Acegi認證授權流程包括認證流程和授權流程兩部分.
認證流程分為以下4個步驟.用戶通過認證后,進入授權流程.認證流程見圖1.
(1)過濾器攔截URL請求當用戶登陸時,Acegi通過Authentication Processing Filter過濾器攔截登陸請求URL,獲取Principal和Credential信息(即用戶名和密碼).
(2)認證管理器調用相應的提供者驗證用戶名密碼Authentication Processing Filter過濾器調用Authentication Manager進行驗證.Authentication Manager本身沒有實現驗證的功能,它是通過調用提供者(provider)來進行驗證的.一個管理者可以具有多個提供者程序,但只要有一個提供者驗證通過,管理者就認為驗證成功.此外,還可以在配置文件中配置提供者程序.
(3)提供者進行驗證是真正的驗證模塊,并且決定了驗證的模式.目前Acegi提供了Dao,Jaas,Cas,X509,Ldap等幾種驗證方式.通過驗證后,提供者將Authentication對象返回.
(4)認證成功保存用戶信息Authentication Processing Filter將對象保存到Context Holder中,并為以后的驗證使用提供程序性能.

圖1 Acegi認證流程
授權流程分為攔截用戶請求、鑒權和投票3步.
(1)攔截用戶請求用戶提交請求,攔截器Filter Security Interceptor攔截請求,攔截器本質上也是一個過濾器.
(2)鑒權攔截器調用Access Decision Manager進行鑒權,主要是通過投票的方式來決定用戶是否有權限訪問資源.投票包括參與者和策略兩方面.投票的參與者Decision Voters是Access Decision Manager的一個屬性,可決定用戶是否能訪問資源.例如Role Voter用來判斷用戶是否有訪問資源的權限,Maxuser Voter用以決定某個資源的訪問用戶數是否達到最大值等.投票策略是由Acegi提供的Affirmative Based對象,其策略就是只要有一個投票通過就全體通過.Unanimous Based對象的策略是必須全體投票通過才能通過.
(3)投票投票類必須實現Access Decision Voter接口,可通過Vote方法來完成.Vote方法返回一個int型的數據代表投票結果,它們是Access Decision Voter的3個靜態成員屬性,即ACCESS_ ABSTAIN,ACCESS-DENIED和ACCESS_ GRANTED,分別表示棄權、否決和贊成.
上海市研究生學術網站(以下簡稱學術網站)是一個針對高校在校學生學術交流的平臺.網站由前臺與后臺兩個部分構成.前臺程序一般用戶(不需要認證)可以進行在線瀏覽學術會議公告、會議新聞、咨詢會議問題,以及會議注冊等.對于注冊用戶(注冊并通過認證)可以提交會議論文,并進行論文狀態查詢等.網站后臺部分由管理員對網站內容進行管理,如發布會議信息、公告、新聞、會議論文管理,以及會議注冊人員管理等.學術網站采用典型的MVC(即業務層Model,界面層View,控制層Controller)架構,安全設計使用AOP技術,其架構如圖2所示.

圖2 網站MVC架構設計
網站安全設計主要包括訪問用戶的分組、網站安全數據庫的設計,以及Acegi配置文件的編寫.
3.2.1 訪問用戶分組
針對該網站需求,我們根據角色不同將用戶分為4種類型:一是一般用戶,不需要注冊,即可訪問普通URL資源;二是注冊用戶,可以向會議提交論文;三是會議管理組,即針對特定會議的管理員小組,該組成員可以對特定會議進行管理,具備接受與會者的注冊及其論文等功能;四是網站管理組,可分配會議管理員權限,該組成員及權限分配可通過數據庫表映射.
3.2.2 網站安全數據庫的設計
根據Acegi安全保護粒度所支持的3種類型——URL資源、業務對象、業務方法等,本網站將安全信息在數據庫中作持久化保存.這些安全信息主要由用戶表、權限表、角色表、資源表等組成.在設計過程中遵循一個用戶擁有多個角色,一個角色擁有多個相應的權限,一個權限可以對應多個資源的設計原則.
這樣,配置可以更靈活地使用Acegi安全策略.該數據庫設計見圖3.

圖3 Acegi認證部分數據庫表
3.2.3 Acegi配置文件的編寫
(1)配置過濾器鏈通過Filter Chain Proxy定義一個Authentication Processing Filter的過濾器鏈.這個過濾器鏈可匹配所有的URL請求.

(2)配置認證過濾器Authentication Processing Filter配置主要有選擇認證管理器、處理用戶身份認證服務所在的URL(Filter Processes Url)、認證成功后轉向的URL(Default Target Url),以及認證失敗后轉向的URL(Authentication Failure Url)等.


(3)配置認證管理者Provider Manager使用Dao來獲取用戶名和密碼,Dao Authentication Provider通過比較從數據庫中獲取的用戶名和密碼以及來自認證管理器的通過Authentication對象中傳入的主體和憑證完成身份驗證.

(4)配置基于Dao的認證提供者Dao Authentication Provider主要功能是從數據庫中提取用戶名和密碼,并存放到Cache中,以便今后再次使用.

(5)配置授權管理器這一步主要配置投票策略等.

(1)利用Acegi框架可以顯著減輕程序員負擔,提高工作效率;
(2)可通過配置文件靜態配置資源與角色的映射,但如果在程序運行期間用戶提出動態改變權限分配要求,則需要動態調整相應的配置策略;
(3)需要對Acegi與其他開源項目特別是SSH開源框架的集成作進一步研究.
[1]林青,許鎖坤.基于J2EE的企業級系統持久性框架的設計與實現[J].計算機工程與設計,2007(7):1 732-1 734.
[2]HARROPRob,MACHACEK Jan.Spring專業開發指南[M].北京:電子工業出版社,2006:135-189.
[3]W ILLIAM Stallings.Cryptography and network security:principles and practices[M].3th Edition.NJ:Prentice Hall,2003:9-89.
[4]SPRING.Acegi security reference[EB/OL].[2010-05-20]http://www.acegisecurity.org/reference.html.
[5]BILAL Siddiqui,FREELANCE consultant,WAX-SYS.Securing Java applications with Acegi[EB/OL].[2007-05-09]http://www.ibm.com/developerworks/cn/java/j-acegi1.
[6]魏楚元,李陶深,張增芳.J2EE安全機制的分析與研究[J].計算機工程與設計,2005(6):1 434-1 437.
(編輯蘇娟)