Можно ли использовать JCIFS с Джерси?

У меня проблемы с добавлением аутентификации NTLM к моему существующему приложению, которое использует Jersey и Apache HttpClient. Я смог только аутентифицироваться с использованием JCIFS, аутентификация NTLM по умолчанию от HttpClient не работает (я получаю 401).

Пример со страницы Apache HttpClient показывает, как использовать CloseableHttpClient: https://hc.apache.org/httpcomponents-client-4.5.x/ntlm.html

Registry<AuthSchemeProvider> authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create()
    .register(AuthSchemes.NTLM, new JCIFSNTLMSchemeFactory())
    .register(AuthSchemes.BASIC, new BasicSchemeFactory())
    .register(AuthSchemes.DIGEST, new DigestSchemeFactory())
    .register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory())
    .register(AuthSchemes.KERBEROS, new KerberosSchemeFactory())
    .build();
CloseableHttpClient httpClient = HttpClients.custom()
    .setDefaultAuthSchemeRegistry(authSchemeRegistry)
    .build();

Но с CloseableHttpClient я не могу использовать такие методы, как target:

WebTarget target = client.target(this.my Address).path(elementPath)
            .resolveTemplate(P_ID, myId);

Есть только execute,

Я не уверен, стоит ли мне переписывать все приложение и использовать только базовые вызовы HttpClient, такие как:

HttpGet httpGet = new HttpGet(repositoryAddress + "/" + "element/70032_1498404600000(,,arm)");
CloseableHttpResponse response = httpClient.execute(httpGet);

или есть другой способ установить AuthSchemes в javax.ws.rs.client.Client, который можно использовать на Джерси?

1 ответ

Я столкнулся с похожими проблемами, и мой подход был ниже:

1) Если вы используете ApacheConnectorProvider в качестве Connector, вы можете переопределить код ApacheConnector (находится здесь https://github.com/jersey/jersey/tree/master/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector). В моем случае мне пришлось создать пользовательские ConnectorProvider и Connector.

2) Создайте пользовательское свойство или используйте HttpClientContext.AUTHSCHEME_REGISTRY и поместите его в ClientConfig (это то, как мы устанавливаем свойства для клиента в клиенте Jersey).

3) Пользовательский соединитель вызывается, когда вы вызываете builder.get (или post, или любым другим методом). В пользовательском соединителе вы можете проверить свойство, установленное на предыдущем шаге. Если он установлен, вы можете установить DefaultAuthSchemeRegistry так же, как это указано для ClosableHttpClient(ApacheConnector использует ClosableHttpClient в своей реализации).

Это может быть своего рода взломом, но у меня отлично работает. Надеюсь это поможет:)

Другие вопросы по тегам