2009-06-26 10 views
0

J'ai créé une classe Java qui se connecte à un site Web IIS nécessitant une authentification NTLM. La classe Java utilise la bibliothèque JCIFS et est basée sur l'exemple suivant:Authentification JCIFS NTLM pour les connexions HTTP sur GlassFish (ou tout conteneur de servlet)

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

L'exemple fonctionne très bien lorsqu'il est exécuté à partir de l'invite de commande, mais dès que je tente d'utiliser le même code dans un conteneur de servlets (en particulier GlassFish), je reçois un IOException contenant le message "Le serveur a renvoyé le code de réponse HTTP: 401 pour l'URL: ....".

J'ai essayé de déplacer le fichier jcifs jar vers le classpath système (% GLASSFISH%/lib), mais cela ne semble pas faire de différence.

Les suggestions sont très appréciées.

Répondre

3

Il semble que ce que je voulais faire est déjà pris en charge en Java 5/6 et je suis donc en mesure d'abandonner l'API JCIFS et faire quelque chose comme ceci:

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

Vous êtes un génie fuc *** ng. Sauvé ma journée. Je t'aime. –

+0

Cela n'est pas sûr pour les threads --- 'Authenticator.setDefault()' définit l'objet _global_ authenticator ... –

0

On dirait que JCIFS n'a pas le droit de créer une usine pour gérer vos URL dans Glassfish. Vous devriez vérifier les paramètres de la politique (checkSetFactory).

La configuration # registerSmbURLHandler() peut avaler la SecurityException.

+0

Il doesn de sembler comme une exception est avalé par Config # registerSmbURLHandler() (Source: http://jcifs.samba.org/src/src/jcifs/Config.java) car il ne définit que la propriété java.protocol.handler.pkgs à jcifs. J'ai essayé d'ajouter la propriété aux options JVM de GlassFish, mais aussi sans chance. –

+0

JCIFS enregistre un URLStreamHandler. Cela n'est pas fait dans la classe Config. Vous devez regarder dans les implémentations de transport à l'intérieur des paquets subordonnés. Donc, cela pourrait encore être le problème de sécurité. – cafebabe

Questions connexes