2010-06-22 2 views
19

У меня есть простая командная строка Java JAX-WS app для тестирования SOAP-запроса, но сервер ожидает, что тип пароля будет PasswordText, и я не понимаю, как это установить. ..JAX-WS Password Type PasswordText

код выглядит так:

@WebServiceRef 
private static final HelloService helloService = new HelloService(url, new QName(
     URL, "HelloService")); 

public static void main(final String... args) { 

    try { 
     final HelloPort helloPort = helloService.getHelloPort(); 
     final BindingProvider hB = ((BindingProvider) helloPort); 
     hB.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
            END_POINT_ADDRESS); 
     hB.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, 
            USERNAME); 
     hB.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, 
            PASSWORD); 
     ... 

Я проверил запрос с использованием SOAP-интерфейс, так что я знаю, что это работает. Любая помощь по настройке пароля будет оценена по достоинству.

Спасибо.

ответ

28

Это установит имя пользователя и пароль для базовой HTTP-аутентификации. Если вы протестировали его в SoapUI, я предполагаю, что значение «PasswordText», о котором вы говорите, является «WSS-Password Type» на панели сведений о запросе. Это устанавливает безопасность WSS, а не защиту HTTP.

С JAX-WS в Java6 вам необходимо подключить SOAPHandler для ввода WSS-Usertoken в заголовок SOAP. Есть много бит и бобов об этом вокруг сети, но я не мог найти ни одной ссылки для публикации, так что вместо этого вам понадобится код ...

Чтобы добавить обработчик, вам нужно что-то вроде:

final Binding binding = ((BindingProvider) servicePort).getBinding(); 
List<Handler> handlerList = binding.getHandlerChain(); 
if (handlerList == null) 
    handlerList = new ArrayList<Handler>(); 

handlerList.add(new SecurityHandler()); 
binding.setHandlerChain(handlerList); // <- important! 

Тогда класс SecurityHandler выполнит это дело. Обработчики - это общие вещи и вызываются как для успешных сообщений, так и для сбоев, но, возможно, что более важно, они вызываются в как сообщениям - для исходящего запроса, а затем снова для входящего ответа. Вы только хотите обрабатывать исходящие сообщения. Так что вам нужно что-то вроде:

public final class SecurityHandler implements SOAPHandler<SOAPMessageContext> { 

    ... 

    @Override 
    public boolean handleMessage(final SOAPMessageContext msgCtx) { 

     // Indicator telling us which direction this message is going in 
     final Boolean outInd = (Boolean) msgCtx.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 

     // Handler must only add security headers to outbound messages 
     if (outInd.booleanValue()) { 
      try { 
       // Get the SOAP Envelope 
       final SOAPEnvelope envelope = msgCtx.getMessage().getSOAPPart().getEnvelope(); 

       // Header may or may not exist yet 
       SOAPHeader header = envelope.getHeader(); 
       if (header == null) 
        header = envelope.addHeader(); 

       // Add WSS Usertoken Element Tree 
       final SOAPElement security = header.addChildElement("Security", "wsse", 
         "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); 
       final SOAPElement userToken = security.addChildElement("UsernameToken", "wsse"); 
       userToken.addChildElement("Username", "wsse").addTextNode("MyWSSUsername"); 
       userToken.addChildElement("Password", "wsse").addTextNode("MyWSSPassword"); 

      } catch (final Exception e) { 
       LOG.error(e); 
       return false; 
      } 
     } 
     return true; 
    } 

    ... 
    // Other required methods on interface need no guts 
} 

я сделал несколько предположений здесь, но, надеюсь, он будет получать вы собираетесь!

С уважением.

+1

Спасибо. Это сработало отлично, и ваш ответ был почти невозможно найти в Googling, поэтому позвольте мне добавить несколько ключевых слов. JAX-WS WSSE – Jimmy2Times

+1

При использовании этого кода я получил следующее исключение в журнале: 'com.sun.xml.internal.messaging.saaj.soap.impl.ElementImpl addChildElement SEVERE: SAAJ0101: Родитель SOAPBodyElement должен быть SOAPBody'. – Vic

5

Если вы реализуете интерфейс SOAPHandler, метод msgCtx.getMessage() будет отображать весь XML, а если вы работаете с большими файлами, вы будете иметь ошибки в памяти. Я тестировал с аутентификацией UsernameToken на JAX-WS клиента и он работает:

String SECURITY_NS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; 
String PASSWORD_TYPE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"; 
String AUTH_PREFIX = "wss"; 

MyService service = new MyService(); 
MyServicePort port = service.getMyServicePort(); 

try { 
    SOAPFactory soapFactory = SOAPFactory.newInstance(); 
    SOAPElement security = soapFactory.createElement("Security", AUTH_PREFIX, SECURITY_NS); 
    SOAPElement uToken = soapFactory.createElement("UsernameToken", AUTH_PREFIX, SECURITY_NS); 
    SOAPElement username = soapFactory.createElement("Username", AUTH_PREFIX, SECURITY_NS); 
    username.addTextNode("username"); 

    SOAPElement pass = soapFactory.createElement("Password", AUTH_PREFIX, SECURITY_NS); 
    pass.addAttribute(new QName("Type"), PASSWORD_TYPE); 
    pass.addTextNode("password"); 

    uToken.addChildElement(username); 
    uToken.addChildElement(pass); 
    security.addChildElement(uToken); 

    Header header = Headers.create(security); 
    ((WSBindingProvider) port).setOutboundHeaders(header); 

    // now, call webservice 

} catch (SOAPException ex) { 
    ex.printStackTrace(); 
} 

Edit: Вы должны добавить "rt.jar" от JRE к классам.

+0

Я пробую это, но я получаю javax.xml.ws.WebServiceException: java.lang.ClassCastException: com.sun.xml.ws.message.DOMHeader нельзя отнести к com.sun.xml.ws.security.opt.impl. outgoing.SecurityHeader \t в com.sun.xml.wss.jaxws.impl.SecurityClientTube.processRequest (SecurityClientTube.java:250) \t на com.sun.xml.ws.api.pipe.Fiber .__ doRun (Fiber.java : 1063) – Steve

+0

Я думаю, что это связано с наличием метро в jar в classpath, но мне нужен тот – Steve

 Смежные вопросы

  • Нет связанных вопросов^_^