Apache Camel v2.12 | CXF组件|基本认证

时间:2014-01-21 06:14:39

标签: java web-services authentication cxf apache-camel

尊敬的专家,

我正在尝试访问需要基本身份验证的Web服务。我可以使用CXF的JaxWsDynamicClientFactory进行访问。 auth的代码片段如下:

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient(ID_WSDL);

HTTPConduit conduit= (HTTPConduit) client.getConduit();
AuthorizationPolicy authorization =  conduit.getAuthorization();
authorization.setUserName(USERNAME);
authorization.setPassword(PWD);

conduit.setAuthorization(authorization);

但是,当我尝试使用Camel的CXF组件访问同一个Web服务时,我收到401 Unauthorized错误,因为Camel没有将身份验证信息发送到Web服务。

我的路线如下:

from("file://c:/test?fileName=request.txt&noop=true").routeId("myrouteId")
.process(processor)
.to(cxf)
.to("log:{body}");

在我的处理器中,我按如下方式设置凭据:

Map<String, Object> properties = new HashMap<String, Object>();

AuthorizationPolicy authPolicy = new AuthorizationPolicy();
authPolicy.setAuthorizationType(HttpAuthHeader.AUTH_TYPE_BASIC);
authPolicy.setUserName(USERNAME);
authPolicy.setPassword(PWD);

properties.put("org.apache.cxf.configuration.security.AuthorizationPolicy", authPolicy);
myEndpoint.setProperties(properties);

myEndpoint是CXFEndpoint,从Exchange检索。

我在这里错过了什么或错了。

有类似的question。因为我无法发表评论,所以我在那里提出了疑问。但是,我的答案已被删除。所以,我提出了一个新的问题,希望我能在这方面取得一些进展。

Thks&amp; brgds

1 个答案:

答案 0 :(得分:1)

在Willem的帮助下,能够使这个工作。身份验证凭据需要传递到Route Builder中的CXF端点,而不是传递到处理器中。这是Williem在Camel论坛上所解释的:

  

如果在处理器中设置cxfEndpoint属性,则它是运行时的设置。   由于CxfProducer是在驼峰上下文启动路径期间创建的,因此cxfEndpoint的属性未被更新。

因此,要解决此问题,请将以下代码添加到Route Builder中:

Map<String, Object> properties = new HashMap<String, Object>(); 

AuthorizationPolicy authPolicy = new AuthorizationPolicy(); 
authPolicy.setAuthorizationType(HttpAuthHeader.AUTH_TYPE_BASIC); 
authPolicy.setUserName(USERNAME); 
authPolicy.setPassword(PWD); 
authPolicy.setAuthorization("true");

//properties.put(AuthorizationPolicy.class.getName(), authPolicy);
properties.put("org.apache.cxf.configuration.security.AuthorizationPolicy", authPolicy);

CxfEndpoint myCxfEp = (CxfEndpoint)getContext().getEndpoint("cxf://");
myCxfEp.setProperties(properties); 

此外,Apache Camel的2.12.3版引入了用于基本身份验证的用户名和密码选项。