【问题标题】:Spring WS Client — Authentication using KeyStore/TrustStore and Credentials (Basic Auth)Spring WS Client — 使用 KeyStore/TrustStore 和 Credentials 进行身份验证(基本身份验证)
【发布时间】:2017-10-18 13:18:35
【问题描述】:

我有一个 Spring WS 客户端,它需要使用密钥库/信任库组合以及基本身份验证进行身份验证。

这是我目前拥有的相关 Spring 配置:

@Configuration
public class SpringWSConfig {
  @Bean
  public Jaxb2Marshaller jaxb2Marshaller() {
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setPackagesToScan("io.shido.credit.domain");
    return marshaller;
  }

  @Bean
  public WebServiceTemplate webServiceTemplate() throws Exception {
    final WebServiceTemplate template = new WebServiceTemplate(jaxb2Marshaller(), jaxb2Marshaller());
    template.setDefaultUri("https://domain.tld/SVC/data");
    //template.setMessageSenders(new WebServiceMessageSender[]{ messageSender(), messageSender2() });
    //template.setInterceptors(new ClientInterceptor[] { wss4jSecurityInterceptor() });
    template.setMessageSender(messageSender());
    return template;
  }

  @Bean
  public HttpsUrlConnectionMessageSender messageSender() throws Exception {
    HttpsUrlConnectionMessageSender messageSender = new HttpsUrlConnectionMessageSender();
    messageSender.setTrustManagers(trustManagersFactoryBean().getObject()); // set the trust store(s)
    messageSender.setKeyManagers(keyManagersFactoryBean().getObject()); // set the key store(s)
    return messageSender;
  }

这适用于密钥库/信任库部分。我能够成功地进行 SSL 握手,但现在我得到了一个 HTTP 401 (Unauthorized)。所以我尝试了:

  • 拥有多个senders;其中一个HttpComponentsMessageSender 上面有用户名和密码......但它不起作用
  • 用一些Wss4jSecurityInterceptor config/settings 配置ClientInterceptor...也不起作用
  • 要使用从HttpsUrlConnectionMessageSender 继承的发件人,请添加usernamepassword 字段,覆盖prepareConnection 并设置connection.setRequestProperty 以使用Authorization 标头。这次我得到一个 HTTP 405 (Method Not Allowed)

任何线索如何做到这一点?

【问题讨论】:

    标签: web-services authentication spring-ws


    【解决方案1】:

    我最终创建了一个新类并将其作为 message sender 注入到 Spring 的 WebServiceTemplate 中。这解决了HTTP 401 (Unauthorized)——不太记得HTTP 405 (Method Not Allowed)

    @Bean
    public HttpsUrlConnectionMessageSender messageSender() throws Exception {
      HttpsUrlConnectionMessageSender messageSender = new BasicAuthHttpsConnectionMessageSender(username, password);
      // ...
      return messageSender;
    }
    

    // You might need org.springframework.ws:spring-ws-support in order to
    // have HttpsUrlConnectionMessageSender
    public final class BasicAuthHttpsConnectionMessageSender extends HttpsUrlConnectionMessageSender {
      private String b64Creds;
    
      public BasicAuthHttpsConnectionMessageSender(String username, String password) {
        b64Creds = Base64.getUrlEncoder().encodeToString((username + ":" + password).getBytes(StandardCharsets.UTF_8));
      }
    
      @Override
      protected void prepareConnection(HttpURLConnection connection) throws IOException {
        connection.setRequestProperty(HttpHeaders.AUTHORIZATION, String.format("Basic %s", b64Creds));
        super.prepareConnection(connection);
      }
    }
    

    请参阅this answer 了解更多信息。两者都是相关的(如果不是几乎相同的话)。

    【讨论】:

      猜你喜欢
      • 2017-06-13
      • 2013-05-30
      • 2015-08-12
      • 2011-10-17
      • 2011-01-28
      • 1970-01-01
      • 2016-07-01
      • 2014-09-22
      • 1970-01-01
      相关资源
      最近更新 更多