Проверка подлинности NTLM в HttpURLConnection не работает в JRE, но работает в среде JDK
Я использую Eclipse для разработки 2 частей приложения.
Веб-часть предоставляет сервисы REST, а запросы к сервисам фильтруются с использованием waffle.servlet.NegotiateSecurityFilter
который извлекает информацию для входа в Windows, чтобы идентифицировать пользователя.
Клиентская часть использует HttpURLConnection
отправлять запросы в веб-часть. Насколько я понимаю, информация Ntlm автоматически упаковывается в запрос.
Пока я тестировал это в затмении, оно работало нормально. Когда я развернул клиентский JAR, он не работал. Я получаю 401 Not Authenticated.
После небольшого исследования я обнаружил, что могу воспроизвести это в eclipe, установив для среды выполнения JRE вместо значения по умолчанию, которое является JDK.
У меня установлены JRE "1.8.0_201" и JDK "1.8.0_161".
Таким образом, просто изменив среду выполнения с JRE на JDK, я могу получить соединение для аутентификации.
Что JDK делает по-другому и что я могу сделать, чтобы заставить клиента работать с JRE?
1 ответ
Я думаю, что первый ответ Как обеспечить аутентификацию ntlm при вызове любого URL? можете ответить на этот вопрос. В Java 8u201 есть новая опция JRE jdk.http.ntlm.transparentAuth, которая по умолчанию отключена
Мне не удалось найти разницу между JRE и JDK. Вместо этого я нашел этот обходной путь.
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient-win -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient-win</artifactId>
<version>4.5.7</version>
</dependency>
Образец кода
if (!WinHttpClients.isWinAuthAvailable()) {
log.warn("Integrated Win auth is not supported!!!");
}
// There is no need to provide user credentials
// HttpClient will attempt to access current user security context through
// Windows platform specific methods via JNI.
try (CloseableHttpClient httpclient = WinHttpClients.createDefault()) {
HttpGet httpget = new HttpGet(getRestUrl().toURI());
log.debug("Executing request " + httpget.getRequestLine());
try (CloseableHttpResponse response = httpclient.execute(httpget)) {
int status = response .getStatusLine()
.getStatusCode();
if (status != 200) {
log.error("HTTP error " + status);
throw new RuntimeException("Failed : HTTP error code : " + status);
}
Type listType = new TypeToken<HashMap<String, App>>() {
}.getType();
return new Gson().fromJson(new InputStreamReader(response .getEntity()
.getContent(),
"UTF-8"), listType);
}
}