Тип пароля JAX-WS PasswordText

У меня есть простое приложение JAX-WS Java командной строки для тестирования запроса SOAP, но сервер ожидает, что Типом пароля будет 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-UI, таким образом, я знаю, что он работает. Любая справка при установке типа пароля ценилась бы.

Спасибо.

21
задан Mark Chorley 2 May 2013 в 09:43
поделиться

1 ответ

Это задает имя пользователя и пароль для базовой 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
}

Я сделал несколько предположений, но, надеюсь, это поможет вам!

С уважением.

34
ответ дан 29 November 2019 в 20:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: