Перехват заголовка веб-службы cxf с помощью Apache Camel (Java DSL)

Я создал клиент веб-службы для обработки мыльных веб-служб cxf с помощью apache camel.

String serviceUri = "cxf:http://localhost:10000/myservice?serviceClass=" + 
    MyRequest.class.getCanonicalName();

from(uri).to("mock:xyz");

Веб-служба получает вызов мыла, но выдает исключение, поскольку запрос требует обработки для wss.

org.apache.cxf.binding.soap.SoapFault: MustUnderstand headers: [{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security] are not understood.

Причина в том, что сервис требует безопасности ws, в чем можно убедиться, взглянув на запрос.

<SOAP-ENV:Header><wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" SOAP-ENV:mustUnderstand="1">

Я обнаружил, что мне нужно реализовать перехватчик для обработки свойств заголовка.

Мои вопросы:

  • Как я могу добавить перехватчик для обработки атрибутов заголовка с помощью Camel Java-DSL?

  • Будет ли этого достаточно, чтобы избавиться от ошибки SOAP?


person ABX    schedule 12.12.2016    source источник


Ответы (1)


Вы можете сделать это с помощью опции cxfEndpointConfigurer @see: Конфигурация Camel-CXF

(Я использую Spring (это намного проще)), но я думаю, что для DSL URI будет выглядеть так:

String serviceUri = "cxf:http://localhost:10000/myservice?serviceClass=" + 
MyRequest.class.getCanonicalName() +
"&cxfEndpointConfigurer="+ MyConfigurer.class.getCanonicalName();

путем реализации org.apache.camel.component.cxf.CxfEndpointConfigurer у вас есть возможность добавить Interceptor внутри метода configureServer

server.getEndpoint().getInInterceptors().add(new MyJAASLoginInterceptor());

если вы запускаете свой Camel в контейнере с JAAS (например, JBOSS), вы можете использовать расширение из

org.apache.cxf.interceptor.security.JAASLoginInterceptor

с необходимым обработчиком обратного вызова. Простой пример, который проверяет пользователя/пароль из заголовка WSS против пользователей JBOSS:

public class MyJAASLoginInterceptor extends javax.security.auth.callback.JAASLoginInterceptor {

  @Override
  protected CallbackHandler getCallbackHandler(String name, String password) {

    return new org.apache.cxf.interceptor.security.NamePasswordCallbackHandler(name, password, "setCredential");

  }

}
person Vadim    schedule 12.12.2016
comment
к сожалению, &cxfEndpointConfigurer=+ MyConfigurer.class.getCanonicalName(); не работает, я получаю сообщение об ошибке Не удалось найти подходящий установщик для свойства: cxfEndpointConfigurer, так как нет метода установки с таким же типом: java.lang.String и возможным преобразованием типа: - person ABX; 13.12.2016
comment
Пожалуйста. прочитайте это: camel.465427.n5.nabble.com / - person Vadim; 13.12.2016