摘要:本文分析了Acegi安全框架,詳細說明了Acegi安全框架的工作過程。舉例說明了Acegi安全框架的具體應(yīng)用,討論了如何利用Acegi進行Web資源的認(rèn)證和授權(quán)。使用一種基于數(shù)據(jù)庫的策略來對Acegi資源配置進行動態(tài)擴展,滿足電子商務(wù)系統(tǒng)中用戶在運行期間的動態(tài)改變權(quán)限的需求。
關(guān)鍵詞:認(rèn)證;授權(quán);安全框架;電子商務(wù)
中圖分類號:TP393.08 文獻標(biāo)識碼:A 文章編號:1005-6432(2008)41-0028-02
電子商務(wù)是一種全新的企業(yè)經(jīng)營模式,由于其網(wǎng)絡(luò)傳輸信息的特殊性,所以安全問題顯得十分重要。在電子商務(wù)系統(tǒng)中,由于業(yè)務(wù)需求面臨著不斷的變化,安全邏輯應(yīng)該與應(yīng)用業(yè)務(wù)邏輯代碼相分離,采用Acegi安全框架只要在配置文件中定義即可,真正做到了安全邏輯與業(yè)務(wù)邏輯的分離,很好地滿足了電子商務(wù)應(yīng)用程序安全的需求。
一、Acegi安全框架
Acegi是一個基于Spring Framework的安全框架。 Acegi安全系統(tǒng)由過濾器、管理器、提供者和處理程序四種主要類型的組件組成。過濾器提供了常見的安全服務(wù),如身份驗證、會話處理以及注銷。管理器管理是由不同提供者提供的較低級的安全服務(wù)。提供者可用于和不同類型的數(shù)據(jù)存儲服務(wù)通信,Acegi的管理器將在運行時選擇合適的提供者。有時任務(wù)可能會被分解為多個步驟,每個步驟由一個特定的處理程序執(zhí)行,可以使用自己選擇的處理程序來執(zhí)行保護應(yīng)用程序所需的步驟。
Acegi安全系統(tǒng)的安全攔截器包含三個管理類: Authentication Manager(認(rèn)證管理器)用于管理Authentication Provider(認(rèn)證提供者)來對用戶進行認(rèn)證。認(rèn)證管理器依次調(diào)用認(rèn)證提供者的認(rèn)證方法,直到認(rèn)證通過。Access Decision Manager(訪問決策管理器)用于授權(quán)一個特定的操作,先通過Authentication Manager判斷用戶是否通過認(rèn)證,再根據(jù)Object Definition Source的配置信息調(diào)用Access Decision Manager,根據(jù)Role Voter的“投票”評估決定用戶是否有權(quán)訪問某資源。此外還借助于安全攔截器實現(xiàn)了對受保護資源的授限訪問。Run as Manager當(dāng)執(zhí)行特定的操作時,用于選擇性地替換Authentication對象。
二、Acegi的工作流程
當(dāng)客戶機向應(yīng)用程序發(fā)送HTTP請求時,其工作流程如圖1所示。

(1)客戶機向應(yīng)用程序發(fā)送HTTP請求。
(2)容器接收到HTTP請求創(chuàng)建一個請求對象和一個響應(yīng)對象,然后調(diào)用Acegi的過濾器鏈代理。當(dāng)容器調(diào)用代理時,它將向代理發(fā)送請求、響應(yīng)以及過濾器鏈對象。
(3)代理過濾器調(diào)用過濾器鏈中第一個過濾器,向其發(fā)送請求、響應(yīng)和過濾器鏈對象。
(4)鏈中的過濾器逐個執(zhí)行其處理。一個過濾器可以通過調(diào)用過濾器鏈中下一個過濾器隨時終止自身處理。
(5)當(dāng)身份驗證過濾器完成其處理時,這些過濾器將把請求和響應(yīng)對象發(fā)送到應(yīng)用程序中配置的攔截過濾?器。
(6)攔截器決定是否對發(fā)出請求的客戶機進行授權(quán),使它訪問所請求的資源。
(7)如果授權(quán)檢查通過,攔截器將控制權(quán)傳輸給應(yīng)用程序,否則拒絕。
(8)應(yīng)用程序改寫響應(yīng)對象的內(nèi)容。
(9)響應(yīng)對象已經(jīng)準(zhǔn)備好了,容器將響應(yīng)對象轉(zhuǎn)換為HTTP響應(yīng)發(fā)送到發(fā)出請求的客戶機。
三、Acegi具體應(yīng)用
了解了Acegi的工作流程后,在電子商務(wù)系統(tǒng)中的應(yīng)用重點是過濾器和攔截器的配置。Authentication ProcessingFilter 配置如下:
<bean id="authenticationProcessing Filter"class
="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
<property name="authenticationManager">
<ref local="authenticationManager"/>
</property>
<property name="filterProcessesUrl" value="/j_acegi_security_check"/>
<property name="defaultTargetUrl'value="/index.jsp"/>
<property name="authenticationFailureUrl"value="/login.jsp?login_error=1"/></bean>
安全攔截器收到客戶端請求后,決定是否對其進行授權(quán)。由于在運行期間用戶可能會提出動態(tài)改變權(quán)限分配的需求,使用基于數(shù)據(jù)庫的策略讀出相關(guān)的安全配置參數(shù)。首先實現(xiàn)一個Property Editor(例如Customer Editor Configure)來覆蓋默認(rèn)的實現(xiàn)。自定義一個資源定義接口包含核心方法(Get Filter Invocation Definition Source),提供資源和角色的配置,用數(shù)據(jù)庫中的數(shù)據(jù)重新組裝Filter Invocation Definition Source。將Filter Invocation Definition Source Cache中的Filter Invocation Definition Source傳遞給Filter Invocation Interceptor。
配置如下:
<bean id="filterlnvocationInterceptor"class="net.sf.acegisecurity.intercept.web. FilterSecuritylnterceptor">
<property name="authenticationManager">
<ref local="authenticationManager"/>
</property>
<property name="accessDecisionManager"> <ref local="accessDecisionManager"/>
</property>
<property name="objectDefinifionSource">
<ref local="FilterInvocationDefinitionSourceCache"/>
</property></bean>
<bean id="customEditorConfigurer"class="org.springframework.beans.factory. config.CustomEditorConfigurer">
<property name="customEditors">
<map><entry key="org.acegisecurity.intercept.web.FilterlnvocationDefintionSource">
<bean id="filterInvocationDefinitionSourceDaoExtentionEditor" Class="com.skyon.um.se- curity.acegi. intercept.web.FilterlnvocationDefinitionSourceDynamicExtentionEditor"></bean></entry></map></property></bean>
與認(rèn)證授權(quán)相關(guān)的數(shù)據(jù)庫設(shè)計如圖2所示。

四、結(jié)束語
Acegi安全框架真正實現(xiàn)了安全代碼從業(yè)務(wù)代碼中的分離,系統(tǒng)結(jié)構(gòu)更合理。在電子商務(wù)系統(tǒng)中,通過使用數(shù)據(jù)庫策略對Acegi資源配置動態(tài)擴展完成認(rèn)證與授權(quán),很好地解決了電子商務(wù)系統(tǒng)中應(yīng)用程序的安全性需求。
作者單位:華東交通大學(xué)
參考文獻:
路鵬,殷兆麟.基于Spring的Acegi安全框架認(rèn)證與授權(quán)的分析及擴展[J].計算機工程