2009-07-22 5 views
5

J'ai besoin de consommer un service web de repos avec java, en passant les informations d'identification d'un compte d'utilisateur de domaine.s'authentifier avec ntlm (ou kerberos) en utilisant java UrlConnection

en ce moment je fais avec asp classique


set xmlHttp = server.createObject("msxml2.serverxmlhttp") 
xmlHttp.open method, url, false, domain & "\" & user, password 
xmlHttp.send body 
out = xmlHttp.responseText 
set xmlHttp = nothing 

et asp.net



HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); 

request.Credentials = new NetworkCredential(user, password, domain); 

request.Method = WebRequestMethods.Http.Get 

HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 

StreamReader outStream = new StreamReader(response.GetResponseStream(), Encoding.UTF8) ; 

output = outStream.ReadToEnd(); 

comment puis-je parvenir avec java? Prendre en compte que je n'utilise pas les informations d'identification de l'utilisateur actuellement connecté, je spécifie le compte de domaine (j'ai le mot de passe)

s'il vous plaît dites-moi c'est aussi facile qu'avec ASP classique et asp.net ..

Répondre

0

Selon this page, pouvez pouvez utiliser les classes JRE intégrées, avec la mise en garde que les versions antérieures de Java ne peuvent le faire que sur un ordinateur Windows. Toutefois, si vous êtes prêt à vivre avec une dépendance d'une tierce partie, l'OMI Apache Commons HttpClient 3.x est la solution idéale. Here est la documentation pour l'utilisation de l'authentification, y compris NTLM. En général, HttpClient est une bibliothèque beaucoup plus fonctionnelle.

La dernière version de HttpClient est 4.0, mais apparemment cette version does not support NTLM cette version requires a tiny bit of extra work.

Voici ce que je pense le code ressemblerait, bien que je ne l'ai pas essayé:

HttpClient httpClient = new HttpClient(); 
httpClient.getState().setCredentials(AuthScope.ANY, new NTCredentials(user, password, hostPortionOfURL, domain)); 
GetMethod request = new GetMethod(url); 
BufferedReader reader = new InputStreamReader(request.getResponseBodyAsStream()); 

Bonne chance.

+0

Hey Matt, merci beaucoup pour votre réponse, mais je me demande s'il est possible de le faire, avec le Buil dans les classes JRE, en utilisant kerberos au lieu de NTLM .. Je veux dire, kerberos n'est pas un truc ptopiétaire comme NTLM ... – opensas

+0

Dernièrement j'ai entendu dire que le client Apache ne supporte pas NTLMv2. Et ils sont réticents à taper sur JCIFS parce que a) ils prétendent que LGPLv2 n'est pas compatible avec leur licence et b) ils sont généralement fatigués des trucs MS. Mais cela n'a pas d'importance car si vous voulez interagir avec Microsoft, NTLM est le dénominateur commun des mécanismes d'authentification.Kerberos ne fonctionne pas si le client n'a pas accès à un contrôleur de domaine ou si la synchronisation de l'heure est désactivée ou si DNS n'est pas tout à fait correct ou ... – user8134

+0

Hi ioplex. Je ne suis pas sûr d'où vous avez entendu cela, mais c'est incorrect. S'il vous plaît consulter les documents auxquels je me suis connecté. J'ai utilisé avec succès NTLM avec HttpClient 3.x et avec 4.0. –

-2

Jetez un oeil à la classe SpnegoHttpURLConnection dans le projet de filtre de servlet HTTP SPNEGO. Ce projet a également quelques exemples.

Ce projet a un client library qui fait à peu près ce que vous faites dans votre exemple.

Jetez un oeil cet exemple de la javadoc ...

public static void main(final String[] args) throws Exception { 
    final String creds = "dfelix:[email protected]"; 

    final String token = Base64.encode(creds.getBytes()); 

    URL url = new URL("http://medusa:8080/index.jsp"); 

    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

    conn.setRequestProperty(Constants.AUTHZ_HEADER 
      , Constants.BASIC_HEADER + " " + token); 

    conn.connect(); 

    System.out.println("Response Code:" + conn.getResponseCode()); 
} 
+0

fonctionne en fait sans aucune bibliothèque avec le code conn.setRequestProperty ("Authorization", "Basic" + "" + token); – Daniel

+2

Cela ne répond pas à la question. Cette solution fonctionne pour l'authentification de base mais ne fonctionne pas pour l'authentification Kerbos ou NTLM comme la question le demande. –

0

Une solution compatible pour java.net.URLStreamHandler et java.net.URL est com.intersult.net.http.NtlmHandler:

NtlmHandler handler = new NtlmHandler(); 
handler.setUsername("domain\\username"); 
handler.setPassword("password"); 
URL url = new URL(null, urlString, handler); 
URLConnection connection = url.openConnection(); 

Vous pouvez également utiliser java.net.Proxy dans url.openConnection (proxy).

Maven-Dépendance:

<dependency> 
     <groupId>com.intersult</groupId> 
     <artifactId>http</artifactId> 
     <version>1.1</version> 
    </dependency> 
Questions connexes