Java-клиент Apache cxf + аутентификация ntlm и многопользовательская поддержка

Я использую java-клиент apache cxf для подключения моего WS. Я также использую NTLM для аутентификации.

Теперь проблема, с которой я столкнулся из-за кэширования учетных данных. Впервые я попробовал пользователя, у которого нет прав доступа к методу WS. когда я изменил пользователя, он все еще использует того же пользователя для доступа к методу WS.

Я работаю в tomcat, поэтому не могу убить свою JVM ... перепробовал все возможные комбинации на httpClientPolicy.

Любая помощь будет оценена.


person user1834733    schedule 16.04.2014    source источник


Ответы (2)


Это специфическая проблема NTLM. sun.net.www.protocol.https.HttpsURLConnectionImpl получает serverAuthorization через java.net.Authenticator. requestPasswordAuthentication(). Эта информация авторизации хранится в sun.net.www.protocol.http.AuthCacheValue.cache.

Поэтому, если мы переопределим sun.net.www.protocol.http.AuthCacheValue, это означает, что мы можем решить эту проблему.

AuthCacheValue.setAuthCache(new AuthCache()
{
  @Override
  public void remove(String arg0, AuthCacheValue arg1) { }

  @Override
  public void put(String arg0, AuthCacheValue arg1) { }

  @Override
  public AuthCacheValue get(String arg0, String arg1)
  {
    return null;
  }
});

Ссылка:

http://web.archiveorange.com/archive/v/ACbGtycfTs2dqbRNpy6d

http://tigrou.nl/2011/06/11/cached-credentials-in-http-basic-authentication/

person SANN3    schedule 13.06.2014

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

    //Set the jcifs properties
    jcifs.Config.setProperty("jcifs.smb.client.domain", "domainname");
    jcifs.Config.setProperty("jcifs.netbios.wins", "xxx.xxx.xxx.xxx");
    jcifs.Config.setProperty("jcifs.smb.client.soTimeout", "300000"); // 5 minutes
    jcifs.Config.setProperty("jcifs.netbios.cachePolicy", "1200"); // 20 minutes
    jcifs.Config.setProperty("jcifs.smb.client.username", "username");
    jcifs.Config.setProperty("jcifs.smb.client.password", "password");

    //Register the jcifs URL handler to enable NTLM
    jcifs.Config.registerSmbURLHandler();

По-видимому, CXF 3.0 не имеет допустимого способа настройки HTTP-клиента (4.3.x) с экземпляром NTCredentials. См. ошибку https://issues.apache.org/jira/browse/CXF-5671


Кстати, если у вас есть простое сообщение, которое нужно передать, просто используйте HTTP-клиент (я работал с 4.3.4.. не уверен в более ранних версиях) с экземпляром NTCredentials. Это тоже сотворило для меня волшебство. Пример ниже:

    final NTCredentials ntCredentials = new NTCredentials("username", "Passworrd","destination", "domain");
    CredentialsProvider credsProvider = new BasicCredentialsProvider();

    credsProvider.setCredentials(AuthScope.ANY, ntCredentials);
    CloseableHttpClient httpclient = HttpClientBuilder.create()
                                        .setDefaultCredentialsProvider(credsProvider)
                                        .build();
person rakpan    schedule 23.06.2014