Проверка подлинности JCIFS NTLM для HTTP-соединений на GlassFish (или любом контейнере сервлета) - PullRequest
0 голосов
/ 26 июня 2009

Я создал класс Java, который подключается к веб-сайту IIS, требующему проверки подлинности NTLM. Класс Java использует библиотеку JCIFS и основан на следующем примере:

Config.registerSmbURLHandler();
Config.setProperty("jcifs.smb.client.domain", domain);
Config.setProperty("jcifs.smb.client.username", user);
Config.setProperty("jcifs.smb.client.password", password);

URL url = new URL(location);
BufferedReader reader = new BufferedReader(
            new InputStreamReader(url.openStream()));
String line;
while ((line = reader.readLine()) != null) {
    System.out.println(line);
}

Пример отлично работает при выполнении из командной строки, но как только я пытаюсь использовать тот же код в контейнере сервлета (в частности GlassFish), я получаю IOException, содержащий сообщение «Сервер вернул код ответа HTTP: 401 для URL: .... ".

Я пытался переместить jcifs jar в системный путь к классу (% GLASSFISH% / lib), но, похоже, это не имеет значения.

Предложения высоко ценятся.

Ответы [ 2 ]

3 голосов
/ 28 июня 2009

Кажется, что то, что я пытался сделать, уже поддерживается в Java 5/6, и поэтому я смог отказаться от JCIFS API и сделать что-то вроде этого:

public static String getResponse(final ConnectionSettings settings, 
        String request) throws IOException {

    String url = settings.getUrl() + "/" + request;

    Authenticator.setDefault(new Authenticator() {
        @Override
        public PasswordAuthentication getPasswordAuthentication() {
            System.out.println(getRequestingScheme() + " authentication")
            // Remember to include the NT domain in the username
            return new PasswordAuthentication(settings.getDomain() + "\\" + 
                settings.getUsername(), settings.getPassword().toCharArray());
        }
    });

    URL urlRequest = new URL(url);
    HttpURLConnection conn = (HttpURLConnection) urlRequest.openConnection();
    conn.setDoOutput(true);
    conn.setDoInput(true);
    conn.setRequestMethod("GET");

    StringBuilder response = new StringBuilder();
    InputStream stream = conn.getInputStream();
    BufferedReader in = new BufferedReader(new InputStreamReader(stream));
    String str = "";
    while ((str = in.readLine()) != null) {
        response.append(str);
    }
    in.close();

    return response.toString();
}
0 голосов
/ 26 июня 2009

Похоже, JCIFS не имеет права устанавливать фабрику для обработки ваших URL-адресов внутри Glassfish. Вы должны проверить параметры политики (checkSetFactory).

Config # registerSmbURLHandler () может поглотить исключение SecurityException.

...