Java Apache Camel v2.12 | CXF组件|基本身份验证

Java Apache Camel v2.12 | CXF组件|基本身份验证,java,web-services,authentication,cxf,apache-camel,Java,Web Services,Authentication,Cxf,Apache Camel,尊敬的专家们 我正在尝试访问需要基本身份验证的web服务。我能够使用CXF的JAXWSDynamicClient工厂进行访问。auth的代码段如下所示: JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient(ID_WSDL); HTTPConduit conduit= (HTTPConduit) client.getConduit();

尊敬的专家们

我正在尝试访问需要基本身份验证的web服务。我能够使用CXF的JAXWSDynamicClient工厂进行访问。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);
from("file://c:/test?fileName=request.txt&noop=true").routeId("myrouteId")
.process(processor)
.to(cxf)
.to("log:{body}");
然而,当我尝试使用Camel的CXF组件访问同一个Web服务时,我得到了401个未经授权的错误,因为Camel没有向Web服务发送身份验证信息

我的路线看起来像:

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);
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);
Map properties=newhashmap();
AuthorizationPolicy authPolicy=新的AuthorizationPolicy();
authPolicy.setAuthorizationType(HttpAuthHeader.AUTH_TYPE_BASIC);
authPolicy.setUserName(用户名);
authPolicy.setPassword(PWD);
properties.put(“org.apache.cxf.configuration.security.AuthorizationPolicy”,authPolicy);
设置属性(属性);
myEndpoint是从Exchange检索的CXFEndpoint

我是错过了什么还是出了什么问题

有一个类似的例子。我在那里提出了我的疑问作为回答,因为我无法发表评论。不过,我的答案已被删除。因此,我提出了一个新的问题,希望我能在这方面取得一些进展


Thks&brgds在威廉的帮助下,成功地实现了这一目标。身份验证凭据需要传递到路由生成器中的CXF端点,而不是处理器中。这是威廉在骆驼论坛上解释的:

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

因此,要解决此问题,请向管线生成器添加以下代码:

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); 
Map properties=newhashmap();
AuthorizationPolicy authPolicy=新的AuthorizationPolicy();
authPolicy.setAuthorizationType(HttpAuthHeader.AUTH_TYPE_BASIC);
authPolicy.setUserName(用户名);
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(属性);
此外,ApacheCamel的2.12.3版为基本身份验证引入了用户名和密码选项