Это установит имя пользователя и пароль для базовой 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
}
я сделал несколько предположений здесь, но, надеюсь, он будет получать вы собираетесь!
С уважением.
Спасибо. Это сработало отлично, и ваш ответ был почти невозможно найти в Googling, поэтому позвольте мне добавить несколько ключевых слов. JAX-WS WSSE – Jimmy2Times
При использовании этого кода я получил следующее исключение в журнале: 'com.sun.xml.internal.messaging.saaj.soap.impl.ElementImpl addChildElement SEVERE: SAAJ0101: Родитель SOAPBodyElement должен быть SOAPBody'. – Vic