2016-04-08 12 views
0

Я пытаюсь использовать веб-сервис SOAP с использованием spring-ws. Я могу успешно использовать этот веб-сервис из интерфейса SOAP. Однако я получаю несанкционированное исключение:Потребление SOAP WS возвращается Ошибка 401 неавторизованная

org.springframework.ws.client.WebServiceTransportException: Unauthorized [401] 
    at org.springframework.ws.client.core.WebServiceTemplate.handleError(WebServiceTemplate.java:699) 

Как успешно пройти аутентификацию?

Мой код выглядит следующим образом: конфигурация

WebServiceTemplate:

@Bean 
    public WebServiceTemplate webServiceTemplate(Jaxb2Marshaller marshaller){ 
     WebServiceTemplate webServiceTemplate = new WebServiceTemplate(); 
     webServiceTemplate.setDefaultUri("http://ultron.illovo.net:9704/AdminService"); 
     webServiceTemplate.setMarshaller(marshaller); 
     webServiceTemplate.setUnmarshaller(marshaller); 

     Credentials credentials = new UsernamePasswordCredentials("biqa", "welcome1"); 

     HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender(); 
     messageSender.setCredentials(credentials); 
     messageSender.setReadTimeout(5000); 
     messageSender.setConnectionTimeout(5000); 
     webServiceTemplate.setMessageSender(messageSender); 

     return webServiceTemplate; 
    } 

Client:

@Autowired 

WebServiceTemplate webServiceTemplate; 

public CallProcedureWithResultsResponse callProcedureWithResults(String procedureName){ 
    CallProcedureWithResults request = new CallProcedureWithResults(); 
    request.setProcedureName(procedureName); 
    log.info("Calling procedure " + procedureName); 

    CallProcedureWithResultsResponse response = (CallProcedureWithResultsResponse) webServiceTemplate.marshalSendAndReceive("http://ultron.illovo.net:9704/AdminService/AdminService", request); 

    return response; 
} 

JUnit Test

@Test 
    public void testWebService(){ 
     AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ObieeConfiguration.class); 
     ObieeClient client = context.getBean(ObieeClient.class); 
     CallProcedureWithResultsResponse response = client.callProcedureWithResults("GetOBISVersion()"); 
     client.printResponse(response); 
     context.close(); 
    } 
+0

Вы когда-нибудь исправляли это? Если да, то каково было ваше решение? – mattalxndr

ответ

1

мне удалось решить эту проблему, выполнив следующие действия:

Создайте подкласс HttpUrlConnectionMessageSender следующим образом:

public class WebServiceMessageSenderWithAuth extends HttpUrlConnectionMessageSender { 

    String user; 
    String password; 

    public WebServiceMessageSenderWithAuth(String user, String password) { 
     this.user = user; 
     this.password = password; 
    } 

    @Override 
    protected void prepareConnection(HttpURLConnection connection) throws IOException { 
     BASE64Encoder enc = new BASE64Encoder(); 
     String userpassword = user+":"+password; 
     String encodedAuthorization = enc.encode(userpassword.getBytes()); 
     connection.setRequestProperty("Authorization", "Basic " + encodedAuthorization); 
     super.prepareConnection(connection); 
    } 

} 

Мой клиент определяет следующим образом:

public class ObieeClient extends WebServiceGatewaySupport { 

    private static final Logger log = LoggerFactory.getLogger(ObieeClient.class); 

    public CallProcedureWithResultsResponse callProcedureWithResults(String procedureName, String webServiceURL){ 
     CallProcedureWithResults request = new CallProcedureWithResults(); 
     request.setProcedureName(procedureName); 
     log.info("Calling procedure " + procedureName); 

     CallProcedureWithResultsResponse response = (CallProcedureWithResultsResponse) ((JAXBElement) getWebServiceTemplate().marshalSendAndReceive(webServiceURL, request)).getValue(); 

     return response; 
    } 
} 

И наконец, клиент настроен на использование учетных данных, установив отправителя сообщения:

 Jaxb2Marshaller marshaller = new Jaxb2Marshaller();   marshaller.setContextPath("za.co.adaptit.smartdeployment.webservices.wsdl"); 

       //set up web service client 
       ObieeClient client = new ObieeClient(); 
       client.setDefaultUri(host); 
       client.setMarshaller(marshaller); 
       client.setUnmarshaller(marshaller); 
       client.setMessageSender(new WebServiceMessageSenderWithAuth("user", "password")); 

response = client.callProcedureWithResults("NQSModifyMetadata('" + obieeObjectsXML +"')", server.getHost()); 

Надеюсь, это поможет.

0

Я столкнулся с той же проблемой и смог ее решить, определив MessageSender с учетными данными и затем установив его клиенту. Мне не нужно было создавать собственный MessageSender.

@Bean 
public WebServiceMessageSender messageSender(Credentials credentials) throws Exception{ 
    HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender(); 
    messageSender.setCredentials(credentials); 
    return messageSender; 
} 

@Bean 
public Credentials credentials(){ 
    UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(USERNAME, PASSWORD); 
    return credentials; 

} 
0

использовать HttpsUrlConnectionMessageSender для безопасного соединения Https. Это часть зависимостей spring-ws-support. Кроме того, вы можете обойти различные проблемы с сертификатом, используя HttpsUrlConnectonMessageSender, например, совпадение имен общих имен сертификатов.

Не используйте BASE64Encoder, это класс солнечной чаши, который не очень безопасен. используйте Base64 java util, присутствующий в java 1.8 и Base64 apache для версии Java, менее java 1.8

public class WebServiceMessageSenderWithAuth extends HttpsUrlConnectionMessageSender { 

String user; 
String password; 

public WebServiceMessageSenderWithAuth(String user, String password) { 
    this.user = user; 
    this.password = password; 
    } 

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

    String userpassword = user+":"+password; 
    String encodedAuthorization = Base64.encode(userpassword.getBytes()); 
    connection.setRequestProperty("Authorization", "Basic " + encodedAuthorization); 
    //set various properties by using reference of connection according to your requirement 
    } 
}