2014-02-12 17 views
1

Я пишу клиент SOAP с использованием CXF Framework (версия: 2.7.8) для SharePoint 2007. Я следил за онлайн-документацией для добавления поддержки NTLM here. У меня работает клиент, и отслеживание сеанса HTTP показывает, что передаются учетные данные NTLM, однако я все еще получаю неавторизованный ответ 401.Клиент CXF SOAP с NTLM для SharePoint

Код:

Lists listService = new Lists(); 
ListsSoap port = listService.getListsSoap(); 

BindingProvider bp = (BindingProvider) port; 
bp.getRequestContext().put("use.async.http.conduit", Boolean.TRUE); 
Credentials creds = new NTCredentials(USER, PASS, "", DOMAIN); 
bp.getRequestContext().put(Credentials.class.getName(), creds); 

Client client = ClientProxy.getClient(proxy); 
HTTPConduit http = (HTTPConduit) client.getConduit(); 
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); 
httpClientPolicy.setConnectionTimeout(36000); 
httpClientPolicy.setAllowChunking(false); 
httpClientPolicy.setAutoRedirect(true); 
http.setClient(httpClientPolicy); 

// Build request and execute 

Интересно, что я написал подобный клиент, используя HTTP PUT для WebDAV для загрузки документов с помощью библиотеки Apache HTTPClient, и был в состоянии успешно пройти проверку подлинности с помощью NTLM. Кроме того, я смог использовать SOAPUI для вызова той же самой веб-службы списков, к которой я пытаюсь создать клиент Java, и успешно ее аутентифицировал с помощью NTLM.

Я предполагаю, что реализация NTLM отличается между CXF и HTTPClient. Любые мысли о том, что не так с моей реализацией CXF? Или как я могу заставить его отразить реализацию HTTPClient?

ответ

4

Пожалуйста, попробуйте этот путь!

HTTPConduit http = (HTTPConduit)client.getConduit(); 
AsyncHTTPConduit conduit = (AsyncHTTPConduit)http; 
DefaultHttpAsyncClient defaultHttpAsyncClient; 
defaultHttpAsyncClient = conduit.getHttpAsyncClient(); 
defaultHttpAsyncClient.getCredentialsProvider().setCredentials(AuthScope.ANY, 
new NTCredentials(USER,PWD, "", DOM)); 
conduit.getClient().setAllowChunking(false); 
conduit.getClient().setAutoRedirect(true); 
+0

Спасибо за ответ. Когда я попробую ваше предложение, я получаю: 'org.apache.cxf.transport.http.URLConnectionHTTPConduit не может быть передан в org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit'. Я извлекаю свой клиент, используя 'ClientProxy.getClient (proxy)'. Идеи? – lamarvannoy

+0

Это работало очень хорошо для меня, спасибо @Jay! – jlr

+0

Чтобы использовать org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit instread для org.apache.cxf.transport.http.URLConnectionHTTPConduit, нам нужно изменить CXF trannsport на cxf-rt-transports-http-hc-x.x.x.jar –

1

@lamarvannoy, я также получил эту ошибку. Но я нашел другой путь. Вам не нужно передавать HTTPConduit в AsyncHTTPConduit. Давайте попробуем этот материал:

public class Test { 

    static final String kuser = "yourDomain\\username"; 
    static final String kpass = "yourPassword"; 

    static class MyAuthenticator extends Authenticator { 
     public PasswordAuthentication getPasswordAuthentication() { 
      System.err.println("Feeding username and password for " + getRequestingScheme()); 
      return (new PasswordAuthentication(kuser, kpass.toCharArray())); 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     Authenticator.setDefault(new MyAuthenticator()); 
     Lists listService = new Lists(); 
     ListsSoap port = listService.getListsSoap(); 

     Client client = ClientProxy.getClient(port); 
     HTTPConduit http = (HTTPConduit) client.getConduit(); 
     HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); 
     httpClientPolicy.setConnectionTimeout(36000); 
     httpClientPolicy.setAllowChunking(false); 
     http.setClient(httpClientPolicy); 

     String listName = "S030_main"; 
     String rowLimit = "150"; 
     ArrayList<String> listColumnNames = new ArrayList<String>(); 
     listColumnNames.add("Title");  
     Test.displaySharePointList(port, listName, listColumnNames, rowLimit);  
    } 
} 

Вы можете найти реализацию displaySharePointList (метод) в этом посте: http://davidsit.wordpress.com/2010/02/10/reading-a-sharepoint-list-with-java-tutorial/

Я надеюсь, что это будет безопасно ваше время, а другие.

0

Это работает для меня:

Client client = ClientProxy.getClient(port); 
AsyncHTTPConduit conduit = (AsyncHTTPConduit)client.getConduit(); 
AuthorizationPolicy authorization = conduit.getAuthorization(); 
authorization.setUserName("domain\\username"); 
authorization.setPassword("password"); 

На самом деле это работает как для NTLM и Basic

Смежные вопросы