当前位置: 首页 > 知识库问答 >
问题:

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

卜阳
2023-03-14

尊敬的专家,

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

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未经授权的错误,因为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检索。

我是不是漏了什么还是哪里出了问题?

还有一个类似的问题。我在那里提出了我的疑问作为答案,因为我无法发表评论。但是,我的答案已被删除。因此,我提出了一个新的问题,希望我能得到一些方向来推进这个问题。

谢谢。

共有1个答案

澹台浩广
2023-03-14

在Willem的帮助下,能够做到这一点。身份验证凭据需要传递到路由生成器中的CXFendpoint,而不是在处理器中。正如Wilem在Camel论坛上解释的那样:

如果你在一个处理器中设置了cxfEndpoint属性,这是一个运行时的设置。由于CxfProducer是在camel上下文启动路线期间创建的,因此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版本引入了用于基本身份验证的用户名和密码选项。

 类似资料:
  • 问题内容: 从HttpClient 4.3开始,我一直在使用HttpClientBuilder。我正在连接到具有基本身份验证的REST服务。我将凭据设置如下: 但是,这不起作用(我正在使用的REST服务返回401)。怎么了? 问题答案: 从此处的 抢先身份验证 文档中: http://hc.apache.org/httpcomponents-client- ga/tutorial/html/aut

  • 目前我正在开发一个Java工具,它应该可以更新Confluence服务器页面。使用Curl一切都像一个符咒,但是当使用Postman或Java代码(HttpClient Java11)时,我得到了一个 HTTP状态401–未经授权 反应。 在下面的语句中使用curl curl--basic-u user:password-X PUT-H“内容类型:application/json”-d“@test

  • 几天没有任何进展,我需要你的帮助。 使用GWT,我试图与REST服务器通信,服务器位于不同的URL上(需要CORS)<我的配置:服务器spring boot 1.3.3 客户端-GWT 1.7-restygwt 2.0.3 当我在Spring中禁用安全性时,我可以在我的GWT客户端中获取数据。 但是当我启用它时,我总是收到401个请求。REST URL请求直接在Web浏览器中工作(带有其身份验证对

  • 我正在尝试使用OAuth2实现开发一个带有Spring Security性的rest api。但是如何删除基本身份验证呢。我只想向body发送用户名和密码,并在postman上获取令牌。 要删除基本身份验证,并从邮递员的get token中发送body标记中的用户名密码吗 我遇到了一些问题{"错误":"未经授权","error_description":"没有客户端身份验证。尝试添加适当的身份验证

  • 我尝试了angular.js,并从一个restful api的web-ui开始(使用超文本传输协议基本授权)。这真的很好,除了授权工作。 到目前为止,我使用的是设置密码,但大多数情况下浏览器会打开http basic auth的默认登录表单。另一个奇怪的行为是angular请求不包含授权头(选项和GET请求都不包含)。我还尝试使用header配置在每个请求上设置此header,但这也不起作用。 有

  • 我有一个基本的SOAP服务endpoint,实际上是SAP ECC,它表示一个服务。我已经使用SOAPUI4.5测试了该服务,使用HTTPAuth可以正常工作,可以根据事物的外观进行抢占。我看到一个出站“Authorization:Basic BASE64”,服务会做出相应响应。 我现在正试图将其引入Java。我想我会采取SAAJ方法: 但我无法在中添加HTTP身份验证。我相信SAAJ提供了控制S

  • 但我对spring-boot/java还是个新手...有谁能帮我把这条路走对吗? 多谢了。

  • 我的问题是,在获取swagger文件之前,如何将授权头添加到索引hmtl中。我从一个使用基本身份验证的http url获取了这个招摇过市的文件。所以我需要在调用服务之前提供用户和密码。所以现在我需要知道在哪里添加标题。