2012-09-05 14 views
5

que necesitan incorporar una cabecera de autenticación (es decir, como una parte de encabezado de solicitud SOAP) en mi nuevo servicio web. Ese encabezado de autenticación verificará los detalles de ID de usuario y contraseña. Debo verificar el contenido de los detalles del encabezado de solicitud para la autenticación en mi servicio web. Si se autentica, se procesará el cuerpo SOAP de la solicitud, de lo contrario, el Servicio Web devolverá el mensaje de Autenticación no válida a la aplicación cliente que invoca el servicio.elementos Adición de solicitud SOAP Header para la autenticación

no soy capaz de entender cómo crear un servicio web en la que el encabezado de SOAP contendrá algunos elementos (en mi caso, los elementos de autenticación tales como ID de usuario y contraseña).

Normalmente, cualquiera que sea el método expuesto en el servicio vendrá como parte del cuerpo SOAP. Por lo tanto, se confunde cómo proceder con la adición de elementos de autenticación en el encabezado SOAP.

Por favor, ayudar a

Saludos,

+0

¿Alguien puede ver esto? https://stackoverflow.com/questions/43002576/soap-header-xmlnsds-on-each-element-for-xml-signature-generation –

Respuesta

4

Recientemente he escrito una clase que añade credenciales de usuario para SOAP cabecera. Para hacer eso, necesitas crear una clase que implemente la interfaz SOAPHandler<SOAPMessageContext>. Por ej .:

public class MyHandler implements SOAPHandler<SOAPMessageContext> { 

    private static final Logger LOGGER = LoggerFactory.getLogger(MyHandler.class); 

    private String username; 

    private String password; 

    /** 
    * Handles SOAP message. If SOAP header does not already exist, then method will created new SOAP header. The 
    * username and password is added to the header as the credentials to authenticate user. If no user credentials is 
    * specified every call to web service will fail. 
    * 
    * @param context SOAP message context to get SOAP message from 
    * @return true 
    */ 
    @Override 
    public boolean handleMessage(SOAPMessageContext context) { 
     try { 
      SOAPMessage message = context.getMessage(); 
      SOAPHeader header = message.getSOAPHeader(); 
      SOAPEnvelope envelope = message.getSOAPPart().getEnvelope(); 
      if (header == null) { 
       header = envelope.addHeader(); 
      } 
      QName qNameUserCredentials = new QName("https://your.target.namespace/", "UserCredentials"); 
      SOAPHeaderElement userCredentials = header.addHeaderElement(qNameUserCredentials); 

      QName qNameUsername = new QName("https://your.target.namespace/", "Username"); 
      SOAPHeaderElement username = header.addHeaderElement(qNameUsername); 
      username.addTextNode(this.username); 
      QName qNamePassword = new QName("https://your.target.namespace/", "Password"); 
      SOAPHeaderElement password = header.addHeaderElement(qNamePassword); 
      password.addTextNode(this.password); 

      userCredentials.addChildElement(username); 
      userCredentials.addChildElement(password); 

      message.saveChanges(); 
      //TODO: remove this writer when the testing is finished 
      StringWriter writer = new StringWriter(); 
      message.writeTo(new StringOutputStream(writer)); 
      LOGGER.debug("SOAP message: \n" + writer.toString()); 
     } catch (SOAPException e) { 
      LOGGER.error("Error occurred while adding credentials to SOAP header.", e); 
     } catch (IOException e) { 
      LOGGER.error("Error occurred while writing message to output stream.", e); 
     } 
     return true; 
    } 

    //TODO: remove this class after testing is finished 
    private static class StringOutputStream extends OutputStream { 

     private StringWriter writer; 

     public StringOutputStream(StringWriter writer) { 
      this.writer = writer; 
     } 

     @Override 
     public void write(int b) throws IOException { 
      writer.write(b); 
     } 
    } 

    @Override 
    public boolean handleFault(SOAPMessageContext context) { 
     LOGGER.debug("handleFault has been invoked."); 
     return true; 
    } 

    @Override 
    public void close(MessageContext context) { 
     LOGGER.debug("close has been invoked."); 
    } 

    @Override 
    public Set<QName> getHeaders() { 
     LOGGER.debug("getHeaders has been invoked."); 
     return null; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 
} 

Tenga en cuenta que sólo estoy añadiendo las credenciales para la cabecera y volviendo true. Haz lo que quieras con el mensaje completo y devuelve false si algo que se espera falla.

he implementado éste el cliente:

<bean id="soapHandler" class="your.package.MyHandler"> 
    <property name="username" value="testUser"/> 
    <property name="password" value="testPassword"/> 
</bean> 

<jaxws:client "..."> 
    <jaxws:handlers> 
     <ref bean="soapHandler"/> 
    </jaxws:handlers> 
</jaxws:client> 

Pero también se puede implementar en el endpoint.

+0

Si se trata del paquete javax.xml.ws.handler.soap. No sé si funcionará con JAX-RPC, solo lo usé con JAX-WS. Debe probar y ver si funciona :) –

+1

Aquí está el enlace usted debe leer sobre manejador de JAX-RPC con IBM: http://www.ibm.com/developerworks/webservices/library/ws-tipjax2/index.html –

+0

Si tiene un controlador y puede recibir el mensaje en ese controlador, eso significa que puede hacer algo con el mensaje. Solo necesita averiguar cómo modificar el mensaje del estilo RPC. Aquí están los ejemplos de cómo se hace a través de JAX-RPC: http://www.ibm.com/developerworks/xml/library/ws-tip-extend/index.html –

0

podemos obtener encabezado por la dotación no sólo de mensaje de jabón.

Cuestiones relacionadas