1 Reply Latest reply: Aug 6, 2012 10:45 AM by Mauricio Alpuin RSS

    adding ws security to dynamic webservice call

    Patrik Jetzer Newbie

      I'm looking for any kind of documentation, examples for adding a Username Password Token to the webservice call.

       

      The generation of client artefacts with wsimport or wsconsume is not an option, since the callback references are not defined until runtime.

      This is the way the webservice is called tried to access an example reliable messaging enabled webservice deployed on localhost:

       

      import javax.xml.namespace.QName;
      import javax.xml.soap.MessageFactory;
      import javax.xml.soap.SOAPBody;
      import javax.xml.soap.SOAPBodyElement;
      import javax.xml.soap.SOAPElement;
      import javax.xml.soap.SOAPHeader;
      import javax.xml.soap.SOAPMessage;
      import javax.xml.ws.BindingProvider;
      import javax.xml.ws.Dispatch;
      import javax.xml.ws.Service;
      import javax.xml.ws.WebServiceException;
      import javax.xml.ws.soap.SOAPBinding;

      // -------------

       

      public void sendRM() {
              String namespace = "http://ws.example.com/";
              String serviceName = "SimpleService";
              String portName = "SimpleServicePort";
              String methodName = "echoRequest";

       

              try {
                  // Qnames for service as defined in wsdl.
                  QName serviceQName = new QName(namespace, serviceName);

       

                  // QName for Port As defined in wsdl.
                  QName portQName = new QName(namespace, portName);

       

                  // Endpoint Address
                  String endpointAddress = "http://localhost:8080/SimpleWS/SimpleService";

       

                  // Create a dynamic Service instance
                  Service service = Service.create(serviceQName);

       

                  // Add a port to the Service
                  service.addPort(portQName, SOAPBinding.SOAP11HTTP_BINDING,
                          endpointAddress);

       

                  // Create a dispatch instance
                  Dispatch<SOAPMessage> dispatch = service.createDispatch(portQName,
                          SOAPMessage.class, Service.Mode.MESSAGE);

       

                  // Use Dispatch as BindingProvider
                  BindingProvider bp = (BindingProvider) dispatch;

       

                  // Optionally Configure RequestContext to send SOAPAction HTTP Header
                  Map<String, Object> rc = bp.getRequestContext();
                  rc.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE);
                  rc.put(BindingProvider.SOAPACTION_URI_PROPERTY, methodName);

       

                  // --- username, password (is NOT submitted)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                  rc.put(BindingProvider.USERNAME_PROPERTY, "myUsername");
                  rc.put(BindingProvider.PASSWORD_PROPERTY, "myPassword");

       

                  // Obtain a preconfigured SAAJ MessageFactory
                  MessageFactory factory = ((SOAPBinding) bp.getBinding()).getMessageFactory();

       

                  // Create SOAPMessage Request
                  SOAPMessage request = factory.createMessage();

       

                  // Request Header
                  SOAPHeader header = request.getSOAPHeader();

       

                  // Request Body
                  SOAPBody body = request.getSOAPBody();

       

                  // Compose the soap:Body payload
                  QName payloadName = new QName(namespace, methodName, "ns1");

                  SOAPBodyElement payload = body.addBodyElement(payloadName);

                  SOAPElement message = payload.addChildElement("input");

                  message.addTextNode("dummyHelloWorld");

       

                  // Invoke the endpoint synchronously
                  SOAPMessage reply = null;

       

                  try {
                      // Invoke Endpoint Operation and read response
                      reply = dispatch.invoke(request);
                  } catch (WebServiceException wse) {
                      wse.printStackTrace();
                  }

             } catch (Exception e) {

                  e.printStackTrace();
              }
        }

       

      Env Setting:

      JBossAS 4.2.2 JRE 1.5.0_19

      Webservice stack jbossws-metro-3.0.5.GA

       

      I'm suppose to support multiple different security protocols but i can't find any examples not even in the test classes

      for any of the different Tokens (Username, X509, SAML, RSA, etc)

       

      any hints are welcome

        • 1. Re: adding ws security to dynamic webservice call
          Mauricio Alpuin Newbie

          Patrick,

          can solve this issue?

           

           

          I try to implement the same solution as I want to get the soap message that has implemented the ws security.

           

           

          What I have found is that when you create the message with "SoapMessage factory.createMessage request = ();" are creating an independent soap message that is created by the generic client and that is why the header is not modified.

          I guess what is happening to us is that.

           

           

          Either way, I need to add ws security and get the soap message that contains this security to modify the body, if you have the solution and want to share please answer me.

           

          Thanks in advance,

           

          Mauricio A.