關注點分離(separation of concerns)是面向服務的架構(Service-Oriented Architectures,SOA)的核心原則。令人遺憾的是,該原則在實現SOA服務時常常起不到作用。我們通常會看到帶有多個關注點(如安全、事務管理)的巨大的實現類,使用業務邏輯記錄所有混合在一起的關注點。使用Spring Framework和Aspect Oriented Programming (AOP)原則,我們可以將關注點分離,以用于服務實現。
本文中我們將演示如何使用Apache Axis和Spring來開發Web service,并使用Acegi Security對其進行保護——同時保持關注點很好地分離。
動機和設計
本文中我們將使用的示例是名為FundsTransferService的服務,銀行使用該服務將資金從一個賬戶轉移到另一個賬戶�?梢栽诒疚牡膮⒖假Y料部分找到該服務的WSDL及所有源代碼、配置文件和構建文件。我們有意讓該服務保持非常簡單,以便集中討論本文更有意義的方面。在本服務的實現中,我們將涉及三個關注點:
·Web service管道,用來公開作為服務的功能
·用于轉移資金的業務邏輯
·安全性,用于保證只有經授權的用戶才能執行資金轉移
而真正的系統很可能是必須處理其他的關注點,如事務管理、日志等。
我們想設計這樣一種實現,處理每個關注點的代碼與其他的代碼完全分離。對于Web service管道,我們將使用Axis來公開作為服務的功能。用于將資金從一個賬戶轉移到另一個賬戶的業務邏輯將封裝在一組POJO(Plain Old Java Object)中。將通過Acegi Security框架來提供安全性。我們將使用Spring Framework及其AOP工具把各方面聯系起來,使構成該Web service實現的所有代碼之間的依賴性減到最小。
該實現的設計如圖1所示。以黃色表示的對象就是我們需要實現的Web service。以藍色表示的對象來自Axis;以粉紅色表示的對象來自Acegi;以綠色表示的對象來自Spring。FundsTransferService是WSDL中所定義的服務接口。為了簡化圖表,我們將所有Axis類顯示為名為Axis Engine的組件。BasicHandler也是Axis類,但由于它對于設計比較重要(稍后詳述),所以單獨顯示出來。FundsTransferServiceSoapBindingImpl是Axis的生成類,需要實現它來提供服務功能。將直接通過Spring委派業務邏輯POJO AccountMgrImpl(稍后也會對此進行詳細解釋)。AccountMgrImpl與AccountMgr接口捆綁在一起是不錯的做法,因為這樣就允許我們插入Spring以發揮其作用(盡管有其他方法可以不帶接口使用Spring)。
圖1.FundsTransferService實現的設計
現在回到BasicHandler。需要返回的原因涉及到如何選擇以提供安全。在本例中,將在兩個不同級別上處理安全性:Web service的安全性,及應用程序代碼的安全性,如POJO。按照關注點分離的理念,我們提出允許進行分離的設計。Axis允許插入定制的處理程序,偵聽請求和響應消息,以提供其他功能(如安全性)。因此,我們將創建名為AcegiBridgeAuthenticationHandler的定制處理程序,負責處理Web service安全。將擴展Axis類BasicHandler,以便可以將其插入Axis處理程序框架。Acegi將用于提供應用程序級的安全,如提供對POJO的訪問控制。
為了使這些方面無縫工作,需要將Web service安全上下文連接到Acegi安全上下文——因此定制的Axis處理程序類的名稱為AcegiBridgeAuthenticationHandler。它不僅將處理Web service安全性,還負責將從該過程獲取的安全上下文連接到Acegi環境,這樣Acegi就可以決定是否授權訪問POJO。方法是從Web service請求消息中提取安全聲明,進行驗證,然后創建認證令牌,因為我們已經為本例選擇了用戶名/密碼認證,所以為UsernamePasswordAuthenticationToken。然后將該認證令牌設置到Acegi SecurityContext中,這樣稍后在控制訪問業務邏輯POJO時,Acegi可以使用請求方的證書和權限。
文章來源于領測軟件測試網 http://www.kjueaiud.com/