JCIFS NTLM-Authentifizierung für HTTP-Verbindungen auf Glassfish (oder jedes Servlet-Container)

StackOverflow https://stackoverflow.com/questions/1048223

Frage

Ich habe eine Java-Klasse erstellt, die NTLM-Authentifizierung erfordern, um eine IIS-Website verbindet. Die Java-Klasse verwendet die JCIFS Bibliothek und basiert auf dem folgenden Beispiel:

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);
}

Das Beispiel funktioniert gut, wenn sie von der Eingabeaufforderung ausgeführt wird, aber sobald ich versuche, den gleichen Code in einem Servlet-Container verwenden möchten (Glassfish), erhalte ich eine IOException die Meldung „enthält Server zurückgegeben HTTP-Antwortcode: 401 URL:. .... "

Ich habe versucht, das jCIFS Glas an das System Classpath (% GLASSFISH% / lib) bewegt, aber das scheint keinen Unterschied zu machen.

Vorschläge sind sehr willkommen.

War es hilfreich?

Lösung

Es scheint, dass das, was ich versuche bereits in Java 6.5 unterstützt zu tun ist, und ich war daher in der Lage, die JCIFS API fallen zu lassen und etwas tun, wie diese statt:

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();
}

Andere Tipps

Klingt wie JCIFS nicht das Recht hat, eine Fabrik zu setzen für Ihr URLs in Glassfish Handhabung. Sie sollten die Richtlinieneinstellungen (checkSetFactory) überprüfen.

Die Config # registerSmbURLHandler () könnte die Security schlucken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top