Можно ли использовать 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 в своей реализации).
Это может быть своего рода взломом, но у меня отлично работает. Надеюсь это поможет:)