2012-04-12 80 views
0

我試圖從我的客戶端使用WSS4J添加密碼摘要WS-Security位到Web服務調用。我使用Axis的WSDL4J從WSDL生成了客戶機類,並遵循了使用WSS4J將WS-Security的「密碼摘要」標題添加到SOAP消息的指示信息,但返回錯誤消息「發現處理標題時發生錯誤」。添加調試消息,它看起來不像我的CallbackHandler被打到。我做錯了什麼嗎?或者我錯過了一些在WSS4J文檔中無法解釋的安裝程序?使用WSS4J返回「安全Web服務調用返回」處理<wsse:安全>標頭時發現錯誤

class CSProvider { 
    public CS get(CSService csService, URL url, String username) 
      throws ServiceException { 
     CS csPort = csService.getCSPort(url); 

     ((Stub) csPort)._setProperty(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN); 
     ((Stub) csPort)._setProperty(WSHandlerConstants.USER, username); 
     ((Stub) csPort)._setProperty(UsernameToken.PASSWORD_TYPE, WSConstants.PW_DIGEST); 
     ((Stub) csPort)._setProperty(WSHandlerConstants.PW_CALLBACK_CLASS, "com.example.namespace.to.PasswordCallbackHandler"); 

     return csPort; 
    } 
} 

public class PasswordCallbackHandler implements CallbackHandler { 

    @Override 
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { 
     for (Callback callback : callbacks) { 
      if (callback instanceof WSPasswordCallback) { 
       ((WSPasswordCallback) callback).setPassword(PasswordStore.getPassword()); 
      } else { 
       throw new UnsupportedCallbackException(callback); 
      } 
     } 
    } 
} 

回答

1

多閒逛之後,我發現這個問題。正如我預料的那樣,Web服務請求沒有經過PasswordCallbackHandler就出去了,所以他們返回給定的錯誤消息來自遠程服務器,而遠程服務器期望有效的認證憑證。什麼花了一段時間來確定的是,我需要構建服務定位器(csService,在這種情況下),像這樣:

CSService csService = new CSServiceLocator(new FileProvider("client_deploy.wsdd")); 

與client_deploy.wsdd文件類似以下內容:

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> 
    <transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/> 
    <globalConfiguration> 
     <requestFlow> 
      <handler name="csHandler" type="java:org.apache.ws.axis.security.WSDoAllSender"/> 
     </requestFlow> 
    </globalConfiguration> 
</deployment> 

然後設置從CSProvider.get()屬性工作得很好。

我避免了一個wsdd文件,因爲我看到的所有其他示例都使用它來設置用戶名和密碼類 - 這兩件事情直到運行時纔會知道。一個明智的詞:當文檔說你可以使用而不是一個wsdd文件,它只意味着設置這些屬性的目的,而不是完全替換文件。