Добавление UsernameToken (WS-Security-Header) в сообщение SOAP

Я пытаюсь подключиться к существующей веб-службе SOAP. Я дал wsdl и создал классы Java через Apache Axis2 XMLBeans.

Но теперь мне нужно расширить сообщения, отправляемые моим самописным клиентом, с помощью WS-Security-Header. Как я могу это сделать?

Я нашел для этого проект Apache Rampart, но не могу найти никаких решений для расширения сообщений, созданных из моих классов Java, с таким заголовком. Я могу найти только возможности установить безопасность WS для службы (в папке веб-приложения и т. Д.).

Я в восторге от ваших ответов!

Спасибо за помощь!


person mrbela    schedule 15.01.2015    source источник


Ответы (1)


Я исправил свою проблему. Я хочу поделиться с вами своим решением, надеюсь, оно кому-нибудь понадобится!

Как я сказал выше, я создал классы Java из файла wsdl с помощью Apache Axis2 XMLBeans (http://axis.apache.org/axis2/java/core/docs/quickstartguide.html#clientxmlbeans).

После этого мне нужно было добавить заголовок безопасности WS, который должен выглядеть так:

<wsse:Security soap:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <wsse:UsernameToken wsu:Id="UsernameToken-1" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <wsse:Username><YOUR USERNAME></wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"><YOUR PASSWORD></wsse:Password>
    </wsse:UsernameToken>
</wsse:Security> 

Я решил это программно:

В заглушке есть SOAP-метод (один без и один с обработчиком обратного вызова), который вы хотите вызвать для использования веб-сервиса. В этом методе существует переменная с именем _messageContext. Отсюда вы можете получить доступ к заголовку: _messageContext.getEnvelope().getHeader() возвращает экземпляр SOAPHeader. С этим экземпляром я вызываю метод addSecurityToHeader из класса HeaderAddery:

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;

public class HeaderAdder {

    public static void addSecurityToHeader(
            org.apache.axiom.soap.SOAPHeader header) {

        OMFactory factory = OMAbstractFactory.getOMFactory();

        OMNamespace namespaceWSSE = factory
                .createOMNamespace(
                        "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
                        "wsse");

        OMElement element = factory.createOMElement("Security", namespaceWSSE);

        OMAttribute attribute = factory.createOMAttribute("mustUnderstand",
                null, "1");

        element.addAttribute(attribute);

        header.addChild(element);

        OMElement element2 = factory.createOMElement("UsernameToken",
                namespaceWSSE);

        OMNamespace namespaceWSU = factory
                .createOMNamespace(
                        "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd",
                        "wsu");

        attribute = factory.createOMAttribute("Id", namespaceWSU,
                "UsernameToken-1");

        element2.addAttribute(attribute);

        element.addChild(element2);

        OMElement element3 = factory.createOMElement("Username", namespaceWSSE);

        element3.setText("<YOUR USERNAME>");

        OMElement element4 = factory.createOMElement("Password", namespaceWSSE);

        attribute = factory
                .createOMAttribute(
                        "Type",
                        null,
                        "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");

        element4.setText("<YOUR PASSWORD>");

        element2.addChild(element3);
        element2.addChild(element4);
    }
}

И с этим аутентификация сработала, и у меня больше нет ответов об отказе.

Если у вас есть какие-либо вопросы по этому поводу, пожалуйста, дайте мне знать!

С уважением!

person mrbela    schedule 19.01.2015