使用 Apache Camel(Java DSL)拦截 cxf 网络服务 header

Intercepting cxf web service header with Apache Camel (Java DSL)

我创建了一个 Web 服务客户端来使用 apache camel 处理 cxf soap Web 服务。

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

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

Web 服务收到 soap 调用但抛出异常,因为该请求需要处理 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安全,请求llok就可以看到

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

我发现我需要实现一个拦截器来处理 header 属性。

我的问题:

你可以通过 cxfEndpointConfigurer 选项@see:Camel-CXF configuration

(我使用 Spring(它更容易)),但我猜 DSL URI 看起来像:

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

通过实施 org.apache.camel.component.cxf.CxfEndpointConfigurer 您可以在 configureServer 方法中添加拦截器

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

如果你 运行 你的 Camel 在 JAAS 容器中(比如 JBOSS),你可以使用来自

的扩展
org.apache.cxf.interceptor.security.JAASLoginInterceptor

具有所需的回调处理程序。 验证来自 WSS header 的 user/password 针对 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");

  }

}