2009-07-22 17 views
5

Necesito consumir un servicio web de reposo con java, pasando las credenciales de una cuenta de usuario de dominio.autenticarse con ntlm (o kerberos) usando java UrlConnection

En este momento estoy haciendo con ASP clásico


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

y con 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(); 

cómo puedo lograr esto con Java? Tenga en cuenta que no estoy usando las credenciales del usuario actualmente registrado, estoy especificando la cuenta de dominio (tengo la contraseña)

por favor dígame que es tan fácil como con asp clásico y asp.net .. ..

Respuesta

0

De acuerdo con this page, puede utilizar las clases incorporadas de JRE, con la advertencia de que las versiones anteriores de Java solo pueden hacerlo en una máquina con Windows.

Sin embargo, si está dispuesto a vivir con una dependencia de terceros, IMO Apache Commons HttpClient 3.x es el camino a seguir. Here es la documentación para usar autenticación, incluido NTLM. En general, HttpClient es una biblioteca mucho más funcional.

La última versión de HttpClient es de 4,0, pero al parecer esta versión does not support NTLM esta versión requires a tiny bit of extra work.

Aquí es lo que yo creo el código se vería así, aunque yo no lo he probado:

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

Buena suerte.

+0

Hey Matt, muchas gracias por su respuesta, pero me pregunto si es posible hacer esto, con el buil-en las clases JRE, utilizando Kerberos en lugar de NTLM .. Quiero decir, kerberos no es material ptopietary como NTLM ... – opensas

+0

Lo último que escuché es que el cliente Apache NO es compatible con NTLMv2. Y son reacios a tocar JCIFS porque a) afirman que LGPLv2 no es compatible con su licencia yb) en general están cansados ​​de las cosas de MS. Pero no importa porque si quiere interoperar con Microsoft, NTLM es el denominador común de los mecanismos de autenticación.Kerberos no funciona si el cliente no tiene acceso a un controlador de dominio o si la sincronización de tiempo está desactivada o si el DNS no es del todo correcto o ... etc. – user8134

+0

Hola, ioplex. No estoy seguro de dónde oíste esto, pero es incorrecto. Por favor revisa los documentos a los que he vinculado. He utilizado NTLM con éxito tanto con HttpClient 3.xy 4.0. –

-2

Eche un vistazo a la clase SpnegoHttpURLConnection en el proyecto SPNEGO HTTP Servlet Filter. Este proyecto también tiene algunos ejemplos.

Este proyecto tiene un client library que hace más o menos lo que está haciendo en su ejemplo.

Tome una mirada este ejemplo del 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

realmente funciona sin bibliotecas con el código conn.setRequestProperty ("Autorización", "Básico" + "" + token); – Daniel

+2

Esto no responde la pregunta. Esta solución funciona para la autenticación básica pero no funciona para la autenticación Kerbos o NTLM a medida que la pregunta lo hace. –

0

Una solución compatible para java.net.URLStreamHandler y java.net.URL es 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(); 

También puede usar java.net.Proxy dentro de url.openConnection (proxy).

Uso Maven-Dependencia:

<dependency> 
     <groupId>com.intersult</groupId> 
     <artifactId>http</artifactId> 
     <version>1.1</version> 
    </dependency> 
Cuestiones relacionadas