1. 程式人生 > >Axis2學習筆記:使用者身份認證

Axis2學習筆記:使用者身份認證

說明:此處的使用者身份認證不是基於證書系統的身份認證,如果需要通過證書系統進行身份認證,請使用rampart。

        使用者身份認證是很多業務系統必須具備的功能,webService也一樣,經過本人這幾天的學習研究,發現axis2的安全模組rampart不支援基於業務的使用者身份認證,只能是基於證書的身份認證,而很多情況下,我們是需要基於業務使用者的身份認證的,甚至需要與CAS、SHIRO等安全框架進行整合,這時rampart模組就派不上用場了。而單獨的handler,經本人實際測試,在加上後,客戶端直接就不能呼叫服務,還好axis2提供了模組(module)擴充套件,我們可以自己編寫擴充套件模組來實現這一功能。

        廢話不多說,現在就讓我們開始自己的基於業務使用者的身份認證吧。要實現這個功能,我們需要做三件事:1、實現基於業務使用者的身份認證的擴充套件模組,2、在服務端載入擴充套件模組,3、在客戶端呼叫時,往soap頭中新增身份資訊。

        一、實現基於業務使用者的身份認證的擴充套件模組

        這個很好實現,首先,我們需要新建一個普通的JAVA工程,新建兩個類,一個是module另一個是handler。module類必須實現org.apache.axis2.modules.Module介面,可以不用具體實現任何介面方法,除非您的擴充套件模組有初始化及銷燬的操作。這個是AXIS2架構要求的。

        handler類必須繼承org.apache.axis2.handlers.AbstractHandler基類。實現invoke方法,具體的使用者身份認證邏輯在此方法中實現。
    public InvocationResponse invoke(MessageContext arg0) throws AxisFault {
        checkUserPwd(arg0);
        return InvocationResponse.CONTINUE;
    }

        接下來,我們需要編寫module.xml,向axis2表明我們擴充套件的模組的實現是什麼。這個檔案需要我們在src目錄下新建META-INF資料夾,並將這個檔案放到META-INF資料夾下。

<module name="logging" class="com.dbw.checker.UserCheckModule">     <InFlow>         <handler name="InFlowLogHandler" class="com.dbw.checker.UserCheckHandler">             <order phase="loggingPhase"/>         </handler>     </InFlow> </module>
         在module.xml中,除了<InFlow>外,還有<OutFlow>,<InFaultFlow>和<OutFaultFlow>,分別對應入、出、入錯誤、出錯誤四個流程,我們可以根據需要進行配置,像本人現在這個需求,只要在請求進入時進行驗證,因此只要配置<InFlow>即可。
        最後,我們可以使用jar命令或eclipse的匯出jar功能,匯出模組,注意:axis2模組檔案的副檔名必須是.mar。
        二、使用身份認證模組
        在建立了身份認證擴充套件模組後,下一步就是要使用它。         1、將身份認證模組的mar檔案複製到modules目錄,如果此目錄下有models.list檔案,在此檔案中增加身份認證模組的檔名。         2、在axis2.xml的<InFlow>的最後新增phase,像我的這個為<phase name="UserCheckPhase"/>。         3、修改services.xml檔案,在需要身份認證的服務中引用身份認證模組,<module ref="logging"/>。          三、在客戶端呼叫服務
        通過以上兩個大的步驟,我們就完成了服務端的開發工作,這時我們可以通過axis2的code generator功能,生成供客戶端呼叫的stub。當我們什麼都不修改的情況下,會發現呼叫失敗,這是因為我們的客戶端的SOAP頭中沒有包含使用者身份資訊。
         1、改造stub
    /**
     * 客戶端增加soap頭資訊
     *
     * @param sfunc            方法名,注意大小寫
     * @param suser            使用者名稱
     * @param spass            密碼
     */
    public void addClientSoapHeader(String sfunc, String suser, String spass) {
        OMElement header = HeaderOMElement.createHeaderOMElement(
                "http://test.com", sfunc, suser, spass);
        _serviceClient.addHeader(header);
    }
        2、在呼叫具體方法前在SOAP頭中新增使用者身份資訊
            CalculateServiceStub client = new CalculateServiceStub();
            client.addClientSoapHeader("sum", "toone", "111111");
本博文中的例子的下載地址: