需要配置的最后一個屬性是objectDefinitionSource。這就是如何指定訪問受保護的對象上不同方法所需要的認證。在這里,我們只想保護transferFunds()方法,并且只允許訪問manager。通過列出所有符合條件的類名、方法名和進行訪問所需的角色來實現:
com.mybank.bizlogic.AccountMgr.transferFunds=ROLE_MANAGER
定制的Axis處理程序
如先前所描述的,我們需要某個事物來連接Web service安全上下文和Acegi安全上下文。這里即用到定制的Axis處理程序AcegiBridgeAuthenticationHandler。我們保持了非常簡單的實現,這樣易于解釋?赡芤鹱⒁獾牡谝患虑槭撬鼘嶋H上沒有進行任何認證。我們只是從MessageContext中得到用戶名和密碼,然后照舊使用它們。當然,事實上真正的實現將嘗試驗證該信息。需要考慮的事情是真正的實現應該從SOAP消息中提取WS-Security頭,然后進行處理以得到認證信息,而不是像我們這樣僅僅從Axis MessageContext對象中提取他們。
得到認證信息后,接下來就是使其可用于Acegi。通過創建認證令牌,并在Acegi安全上下文中進行設置來實現。由于在進行用戶名和密碼認證,因此將創建UsernamePasswordAuthenticationToken的實例。進行創建前,需要指定為該主體授予了哪些權限。通過使用GrantedAuthority接口和稱為GrantedAuthorityImpl的簡單實現來實現。由于使用RoleVoter來進行訪問決策,因此我們將進行授權的機構是角色。這里我們再次簡化了實現,對其進行硬編碼,授權主體manager角色,因為該角色是在POJO上調用transferFunds()方法所需要的。真正的實現可能將獲取用戶名和密碼,然后在數據庫或目錄服務器中進行查找,以找到與該主體實際相關的角色;蛘,在某些情況下,可在WS-Security頭中以SAML聲明形式獲得該信息。
在任何情況下,一旦完成,都將創建UsernamePasswordAuthenticationToken實例,傳遞用戶名、密碼和授權的角色。通過使用這種形式的構造方法(采用GrantedAuthority數組),實際上在告知Acegi此令牌已經過了認證,因此不必再次進行認證。接下來,通過在SecurityContextHolder上
調用靜態方法來得到SecurityContext,并將認證令牌設置到SecurityContext中,F在認證和角色信息對于Acegi是下游可用的,用于執行其安全檢查。因此,我們已有效地將Web service安全上下文連接到Acegi安全上下文。
有幾件需要考慮的其他事情。首先,Acegi還提供了非?煽康恼J證能力,因此不是讓Axis處理程序來關注認證,可以讓Acegi做這些事情。若要這樣做,使用未采用GrantedAuthority數組的構造方法來創建未經認證的認證令牌。用戶還需要確保配置了適當的認證提供程序,而不是使用AnonymousAuthenticationProvider。第二,Acegi不僅支持用戶名/密碼認證,還支持其他認證。例如,如果在進行基于PKI的認證,用戶可以使用X509AuthenticationToken,而不是UsernamePasswordAuthenticationToken。
最后,需要配置Axis,在服務的請求處理路徑上包含該處理程序。通過向Axis配置文件deploy.wsdd和server-config.wsdd添加以下條目來實現:
use="literal">
結束語
關注點分離是開發面向服務的架構的關鍵原則。但是,它不僅需要應用到架構級,還需要應用到實現級。在本文中,我們演示了如何使用Axis、Spring和Acegi來實現符合SOA原則的受保護Web service。如示例代碼所示,使用該方法使處理每個服務關注點的代碼中的交叉依賴性減至最小。我們所給出的示例是刻意保持簡單的,但應將其作為基礎,用于開發具有可靠安全機制(結合了Web service安全性和Acegi提供的應用程序級安全性)的Web service。如前所述,真正的系統很可能需要開發處理程序,用來處理WS-Security頭并將它們連接到Acegi安全上下文。一種方法是采用Apache工具包WSS4J,然后擴展其Axis處理程序以填充Acegi安全上下文,如本文所述?赡苄枰M行一些其他工作來創建捕獲Acegi安全異常的Axis出站處理程序,并創建返回到客戶端的更有意義的SOAP錯誤。
文章來源于領測軟件測試網 http://www.kjueaiud.com/