【问题标题】:Creating HttpComponentsMessageSender with httpClient使用 httpClient 创建 HttpComponentsMessageSender
【发布时间】:2020-03-25 08:14:16
【问题描述】:

我无法使用 kerberos 授权 SOAP 服务器。 这是我的配置代码

  @Bean
  def webServiceTemplate(): WebServiceTemplate = {
    val webServiceTemplate = new WebServiceTemplate()
    webServiceTemplate.setMarshaller(marshaller.marshaller)
    webServiceTemplate.setUnmarshaller(marshaller.marshaller)
    webServiceTemplate.setDefaultUri(Parameters.getDefaultURI)
    webServiceTemplate.setMessageSender(httpComponentsMessageSender())
    webServiceTemplate
  }

@Bean
  def httpComponentsMessageSender(): HttpComponentsMessageSender = {
    val sender = new HttpComponentsMessageSender()
    if(Parameters.isProduction){
      sender.setHttpClient(getHttpClient())
    } else sender.setCredentials(usernamePasswordCredentials())
    sender
  }

  @Bean
  def usernamePasswordCredentials(): NTCredentials = {
    new NTCredentials(
       "usr",
       "pass",
      "",
      "MY_COMPANY"
    )
  }

  @Bean
  def getHttpClient() = {
    val builder = HttpClientBuilder.create
    val authSchemeRegistry = RegistryBuilder.create[AuthSchemeProvider]
      .register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory(true)).build
    builder.setDefaultAuthSchemeRegistry(authSchemeRegistry)
    builder.setDefaultCredentialsProvider(getCredProvider())
    builder.addInterceptorFirst(new RemoveSoapHeadersInterceptor())
    builder.build
  }

我的 HttpClient 可以向其他 kerberized 服务(如 oozie)发出请求。但是,当使用 SOAP 服务器时,我得到了

Caused by: org.springframework.ws.client.WebServiceTransportException: Unauthorized [401]
        at org.springframework.ws.client.core.WebServiceTemplate.handleError(WebServiceTemplate.java:699)
        at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:609)
        at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555)
        at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:390)
        at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:378)

我使用 krb5module 并提出如下请求

reply = Subject.doAs(subject, new PrivilegedExceptionAction[CreateReply]() {
          @throws[Exception]
          override def run: CreateReply = getWebServiceTemplate
            .marshalSendAndReceive("http://my-soap-service", request)
            .asInstanceOf[CreateReply]

如何授权 SOAP 服务?我做错了什么?

【问题讨论】:

  • 所以我的想法是使用有效的、有效的 httpClient 来配置 HttpComponentsMessageSender。有可能吗?如果没有,那我应该如何处理kerberos auth呢?

标签: java spring soap httpclient kerberos


【解决方案1】:

原来我使用了错误的路径(http://my-soap-service)。我改成有效的,可以授权了。

结论: HttpClient 属性有助于为 SAOP 设置 HttpComponentsMessageSender。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    相关资源
    最近更新 更多