2009-09-03 7 views
1

J'essaye d'utiliser un wsdl généré par gSoap de Netbeans. Le webservice exige que le UserNameToken être passé Lorsque j'utilise le wsdl de SoapUI (qui fonctionne), il envoie ceci:.UserNameToken dans le savon de Java

<wsse:Username>myname</wsse:Username> 
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">mypass</wsse:Password> 

Cependant, quand j'essayer de Netbeans en utilisant un gestionnaire (désigné par How do I add a SOAP Header using Java JAX-WS) comme ceci:

  String prefix = "wsse"; 
      String uri = "http://...wsssecurity..."; 

      SOAPElement securityElem = factory.createElement("Security",prefix,uri); 

       SOAPElement UserNametokenElem = factory.createElement("UserNameToken",prefix,uri); 

        SOAPElement UsernameElem = factory.createElement("wsse:Username"); 
        UsernameElem.addTextNode("myname"); 
        SOAPElement PasswordElem = factory.createElement("Password"); 
        PasswordElem.addTextNode("mypass"); 

        UserNametokenElem.addChildElement(UsernameElem); 
        UserNametokenElem.addChildElement(PasswordElem); 

        securityElem.addChildElement(UserNametokenElem); 
      SOAPHeader header = envelope.addHeader(); 
      header.addChildElement(securityElem); 

il génère les en-têtes de savon comme ceci:

<wsse:Security xmlns:wsse="http://...wsssecurity..."> 
    <wsse:UserNameToken xmlns:wsse="http://...wsssecurity..."> 
    <Username xmlns="">myname</Username> 
    <Password xmlns="">mypass</Password> 
    </wsse:UserNameToken> 
    </wsse:Security> 

qui provoque la réponse du service Web avec une erreur d'authentification.

Mes questions sont donc:

  1. Comment puis-je générer le UserNameToken de manière correcte (comme SoapUI fait)?
  2. Est-il préférable de le faire en utilisant un gestionnaire ou une bibliothèque WSSE externe comme Apache WSS4J (quelqu'un peut me montrer quelques exemples de code pour cette)

Répondre

6

J'ai finalement utilisé avec succès WSS4J, et a fait quelque chose comme ceci:

  SOAPPart soappart = message.getSOAPPart(); 
      SOAPEnvelope envelope = soappart.getEnvelope(); 
      SOAPHeader header = envelope.getHeader(); 
      WSSecHeader wsheader = new WSSecHeader(); 
      wsheader.insertSecurityHeader(soappart); 
      WSSecUsernameToken token = new WSSecUsernameToken(); 
      token.setPasswordType(WSConstants.PASSWORD_DIGEST); 
      token.setUserInfo("myuser", "mypass"); 
      token.build(soappart, wsheader); 

wss4j avait des dépendances imbriquées, alors attention à cela.

+0

Bon exemple. Merci de m'avoir épargné beaucoup de temps! –

Questions connexes