Проверка подлинности NTLM в HttpURLConnection не работает в JRE, но работает в среде JDK - PullRequest
0 голосов
/ 06 февраля 2019

Я использую Eclipse для разработки 2 частей приложения.

Веб-часть предоставляет службы REST, а запросы к службам фильтруются с использованием waffle.servlet.NegotiateSecurityFilter, который извлекает информацию для входа в Windows для идентификации пользователя.

Клиентская часть использует HttpURLConnection для отправки запросовна веб-часть.Насколько я понимаю, информация Ntlm автоматически упаковывается в запрос.

Пока я тестировал это в Eclipse, он работал нормально.Когда я развернул клиентский JAR, он не работал.Я получаю 401 Not Authenticated.

После небольшого исследования я обнаружил, что могу воспроизвести это в eclipe, установив для среды выполнения значение JRE вместо значения по умолчанию, которое является JDK.

У меня установлены JRE "1.8.0_201" и JDK "1.8.0_161".

Итак, просто изменив среду выполнения с JRE на JDK, я смогу установить соединение для аутентификации.

ЧтоJDK работает по-другому, и что я могу сделать, чтобы заставить клиента работать с JRE?

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Я думаю, что первый ответ Как обеспечить аутентификацию ntlm при вызове любого URL? может ответить на этот вопрос.В Java 8u201 есть новая опция JRE jdk.http.ntlm.transparentAuth , которая по умолчанию отключена

0 голосов
/ 07 февраля 2019

Мне не удалось найти разницу между 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);
            }
        }
...