Soap WebService NTLM Authentication with Apache CXF and Spring

Recently I had the "chance" to consume an old school WebService in good old SOAP on top of that it was a C# WebService using the dataset construct which is in itself a world of pain... but we will not talk about that here

A more easy thing to tackle is the NTLM authentication, below is how I implemented it using Spring and Spring boot :

1. Define a set of custom properties in the application.yaml file
 ws:
    base-url: "http://host/ws.asmx?wsdl"
    username: "myusername"
    password: "mypassword"
    authentication: "NTLM"
2. Map the properties in application.yaml to a Java class

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;


@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "app")
@Data
public class YAMLConfig {

    private Ws ws;    

    @Data
    public static class Ws {
        private String baseUrl;
        private String username;
        private String password;
        private String authentication;


    }   

}


import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
import org.springframework.stereotype.Service;
import org.w3c.dom.Element;


import javax.xml.bind.JAXBContext;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
//Injection and other properties omitted for brevity
public void consume(){

        JaxWsProxyFactoryBean factory1 = new JaxWsProxyFactoryBean();
        factory1.setServiceClass(EntityInformationSoap.class);
        factory1.setAddress(yamlConfig.getWs().getBaseUrl());
        factory1.setUsername(yamlConfig.getWs().getUsername());
        factory1.setPassword(yamlConfig.getWs().getPassword());

        EntityInformationSoap service = (EntityInformationSoap) factory1.create();
        Client client = ClientProxy.getClient(service);

        HTTPConduit conduit = (HTTPConduit) client.getConduit();
        conduit.getAuthorization().setAuthorizationType(yamlConfig.getWs().getAuthentication());
        conduit.getAuthorization().setUserName(yamlConfig.getWs().getUsername());
        conduit.getAuthorization().setPassword(yamlConfig.getWs().getPassword());

        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
        httpClientPolicy.setConnectionTimeout(36000);
        httpClientPolicy.setAllowChunking(false);
        conduit.setClient(httpClientPolicy);
}

No comments:

Post a Comment

OSX show used ports or listening applications with their PID

On OSX you can display applications listening on a given port using the lsof the commands described below will show listening application...