Подпишите сообщение SOAP с помощью WS-Security - PullRequest
1 голос
/ 03 июля 2019

Мне нужно использовать SOAP API, который запрашивает все сообщения для подписи политикой "SigOnly".

Я сгенерировал код клиента из WSDL с использованием wsimport и ожидал, что он также сгенерирует код для подписи, но это не так.

MyWebservice service = new MyWebservice();
MyWebservicePortType port = service.getMyWebserviceSOAPportHttp();

// Build request
ObjectFactory objectFactory = new ObjectFactory();
MyRequest request = objectFactory.createMyRequest();

// Call endpoint

port.myRemoteMethod(request);

Существует ли дополнительный параметр для инструмента wsimport для генерации кода для подписи или я пропустил некоторые шаги в коде клиента?

1 Ответ

0 голосов
/ 03 июля 2019

WS-Security - это расширение для soap, поэтому я не думаю, что wsimport справится с этим при генерации кода.В любом случае вы можете написать свой обработчик для добавления заголовков ws-security в ваши запросы мыла.Вы можете добавить обработчик к вашему порту следующим образом:

BindingProvider bp = (BindingProvider) port;
List<Handler> handlerChain = new ArrayList<Handler>();
handlerChain.add( new MyHandler() );
Binding binding = bp.getBinding();
binding.setHandlerChain(handlerChain);

Класс MyHandler должен реализовывать SOAPHandler.Это пример реализации метода handleMessage MyHandler, добавив заголовок

@Override
public boolean handleMessage(SOAPMessageContext smc) {
    Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

    if (outboundProperty.booleanValue()) {

        SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
        SOAPHeader header = envelope.addHeader();
        SOAPElement security = header.addChildElement("Security", "wsse",
                "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
        SOAPElement usernameToken = security.addChildElement("UsernameToken", "wsse");
        SOAPElement username = usernameToken.addChildElement("Username", "wsse");
        username.addTextNode("MyUser");

    }
}
...