尊敬的专家,
我正在尝试访问需要基本身份验证的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
答案 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版引入了用于基本身份验证的用户名和密码选项。