2012-04-12 1 views
0

Ich versuche, Web-Service-Anrufe von meinem Client mithilfe von WSS4J mit Kennwortauszug WS-Sicherheitsbits zu versehen. Ich generierte die Client-Klassen von der WSDL unter Verwendung von WSDL4J von Axis und befolgte die Anweisungen zum Hinzufügen der "Password Digest" -Köpfe der WS-Security zu der SOAP-Nachricht unter Verwendung von WSS4J, kehrte jedoch mit der Fehlermeldung "Ein Fehler wurde beim Verarbeiten der Kopfzeile gefunden" zurück. Das Hinzufügen von Debug-Nachrichten sieht nicht so aus, als ob mein CallbackHandler jemals getroffen wird. Mache ich etwas sehr falsch? Oder fehlt mir ein Setup-Stück, das in der WSS4J-Dokumentation unerklärt bleibt?Sichere Web-Service-Aufrufe mit WSS4J return "Es wurde ein Fehler beim Verarbeiten des <wsse: Security> -Headers entdeckt"

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); 
      } 
     } 
    } 
} 

Antwort

1

Nach viel um Stossen, entdeckte ich das Problem. Wie ich erwartet hatte, gingen die Web-Service-Anfragen ohne durch PasswordCallbackHandler gegangen zu sein, so dass sie mit der angegebenen Fehlermeldung vom Remote-Server zurückgegeben wurden, der gültige Authentifizierungs-Credentials erwartete. Was mir dauerte eine Weile war es festzustellen, dass ich brauchte den Service Locator (csService, in diesem Fall) wie so zu konstruieren:

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

mit einer client_deploy.wsdd Datei etwas wie folgt aus:

<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> 

Dann funktionierte die Einstellung der Eigenschaften von CSProvider.get() gut.

Ich hatte eine Wsdd-Datei vermieden, weil alle anderen Beispiele, die ich gesehen habe, verwendet, um den Benutzernamen und die Passwort-Klasse - zwei Dinge, die ich bis zur Laufzeit nicht wissen. Ein Wort für den Weisen: Wenn die Dokumentation sagt, dass Sie die _setProperty() Methoden anstelle von eine WSDD-Datei verwenden können, bedeutet es nur für die Zwecke der Einstellung dieser Eigenschaften, nicht die Datei vollständig ersetzen.

Verwandte Themen