Spring Boot Web服务客户端身份验证

时间:2016-02-14 21:12:25

标签: spring web-services spring-boot spring-ws

我的目标是调用Web服务,这需要验证(当我在浏览器中查看它的wsdl时,浏览器会要求我登录+密码)。

作为基础,我使用this教程中的示例。

现在我必须添加身份验证配置。

documentation进行配置,比如配置WebServiceTemplate bean可能有所帮助。

但是使用Spring Boot,项目中没有applicationContext.xml或任何其他配置xml。

那么,如何使用Spring Boot配置WebServiceTemplate,或者还有什么可以解决这样的任务?

3 个答案:

答案 0 :(得分:2)

在Spring Boot中,您可以使用@Bean注释配置bean。您可以对不同的bean使用配置类。在这些类中,您需要@Configuaration注释。

这个tutorial描述了Spring教程的“第二部分”。提供教程的主要内容是:(基于Spring教程)

  

问题

     

我使用的SOAP Web服务需要基本的http身份验证,所以我   需要在请求中添加身份验证标头。

     

无身份验证

     

首先,您需要在没有的情况下实现请求   像spring.io上的教程中的身份验证。接着我会   使用身份验证标头修改http请求。

     

在自定义WebServiceMessageSender中获取http请求

     

可以在WeatherConfiguration中访问原始http连接   类。在weatherClient中,您可以设置邮件发件人   WebServiceTemplate。邮件发件人可以访问原始http   连接。所以现在是时候扩展了   HttpUrlConnectionMessageSender并编写它的自定义实现   这会将身份验证标头添加到请求中。我的习惯   发件人如下:

public class WebServiceMessageSenderWithAuth extends HttpUrlConnectionMessageSender{

@Override
protected void prepareConnection(HttpURLConnection connection)
        throws IOException {

    BASE64Encoder enc = new sun.misc.BASE64Encoder();
    String userpassword = "yourLogin:yourPassword";
    String encodedAuthorization = enc.encode( userpassword.getBytes() );
    connection.setRequestProperty("Authorization", "Basic " + encodedAuthorization);

    super.prepareConnection(connection);
}

@Bean
public WeatherClient weatherClient(Jaxb2Marshaller marshaller){

WebServiceTemplate template = client.getWebServiceTemplate();
template.setMessageSender(new WebServiceMessageSenderWithAuth());

return client;
}

答案 1 :(得分:0)

另一种解决方法是在handleRequest()方法中添加一个拦截器并添加requestHeader,从中可以轻松地从HttpUrlConnection派生TransportContextHolder;

这是拦截器类的代码:

public class SecurityInterceptor implements ClientInterceptor {

    @Override
    public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {

        TransportContext context = TransportContextHolder.getTransportContext();
        HttpUrlConnection connection = (HttpUrlConnection) context.getConnection();

        try {
            connection.addRequestHeader("Authorization","Basic VVNFUk5BTUU6cGFzc3dvcmQ=");
        } catch (IOException e) {
            log.error(e.getMessage());
        }
        return true;
    }

    //TODO:: other methods and constructor..
}

,当然还要将拦截器添加到WebTemplate:

WebServiceTemplate webServiceTemplate = new WebServiceTemplate(marshaller);
ClientInterceptor[] interceptors = new ClientInterceptor[]{new SecurityInterceptor()};
webServiceTemplate.setInterceptors(interceptors);
webServiceTemplate.marshalSendAndReceive(uriWebService, request)

答案 2 :(得分:0)

我遇到了同样的问题,并通过以下方法解决了。 基本思路是使用基本用户名和密码以及CredentialsProvider创建AuthScope.ANY

@Bean
public WebServiceMessageSender showReqMessageSender(@Value("${ws.username}") String username,
        @Value("${ws.passowrd}") String password) throws Exception {

    final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));

    return new HttpComponentsMessageSender(
        HttpClientBuilder.create().setDefaultCredentialsProvider(credentialsProvider)
            .addInterceptorFirst(new RemoveSoapHeadersInterceptor()).build());
}

仅需更多信息,便进一步使用此消息发送方bean(通过使用extedning WebServiceGatewaySupport类设置)

void org.springframework.ws.client.core.support.WebServiceGatewaySupport.setMessageSender(WebServiceMessageSender messageSender)