2015-01-15 8 views
0

Я пытаюсь подключиться к существующей веб-службе SOAP. Я дал wsdl, и из этого я создал классы Java через Apache Axis2 XMLBeans.Добавление UsernameToken (WS-Security-Heaser) в сообщение SOAP

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

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

Я очень рад вашим ответам!

Благодарим за помощь!

ответ

0

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

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

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

<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> 

Я решил эту programaticly:

В заглушке есть SOAP-метод (один без и один с callbackHandler), который вы хотите вызвать для использования веб-службы. В этом методе используется переменная с именем _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); 
    } 
} 

И с тем, что работал и подлинности у меня нет ни одного Отклонить ответов больше.

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

С уважением!