2009-07-22 14 views
5

Ho bisogno di consumare un servizio web di riposo con java, passando le credenziali di un account utente di dominio.autenticare con ntlm (o kerberos) usando java UrlConnection

in questo momento lo sto facendo con ASP classico


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

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

come posso raggiungere questo obiettivo con Java? Tieni conto che non sto utilizzando le credenziali dell'utente attualmente registrato, sto specificando l'account di dominio (ho la password)

per favore dimmi che è facile come con asp classico e asp.net .. ..

risposta

0

Secondo this page, è possibile utilizzare le classi JRE incorporate, con l'avvertenza che le versioni precedenti di Java possono eseguire questa operazione solo su una macchina Windows.

Tuttavia, se si è disposti a vivere con una dipendenza di terze parti, IMO Apache Commons HttpClient 3.x è la strada da percorrere. Here è la documentazione per l'utilizzo dell'autenticazione, incluso NTLM. In generale, HttpClient è una libreria molto più funzionale.

L'ultima versione di HttpClient è 4.0, ma a quanto pare questa versione does not support NTLM questa versione requires a tiny bit of extra work.

Ecco quello che penso il codice sarebbe simile, anche se non ho provato:

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

Buona fortuna.

+0

Hey Matt, grazie mille per la risposta, ma mi chiedo se è possibile fare questo, con il Buil-in classi JRE, utilizzando Kerberos invece di NTLM .. Voglio dire, kerberos non è roba ptopietaria come NTLM ... – opensas

+0

Ultimo ho sentito, il client Apache NON supporta NTLMv2. E sono riluttanti a toccare JCIFS perché a) affermano che LGPLv2 non è compatibile con la loro licenza eb) sono generalmente stanchi di materiale MS. Ma non importa perché se si vuole interop con Microsoft, NTLM è il comune denominatore dei meccanismi di autenticazione.Kerberos non funziona se il client non ha accesso a un controller di dominio o se la sincronizzazione temporale è disattivata o se DNS non è corretto o ... ecc. – user8134

+0

Hi ioplex. Non sono sicuro di dove hai sentito questo, ma non è corretto. Si prega di consultare i documenti a cui mi sono collegato. Ho usato con successo NTLM con HttpClient 3.xe con 4.0. –

-2

Dai un'occhiata alla classe SpnegoHttpURLConnection nel progetto SPNEGO HTTP Servlet Filter. Questo progetto ha anche alcuni esempi.

Questo progetto ha un client library che praticamente fa quello che stai facendo nel tuo esempio.

Date un'occhiata questo esempio dal 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

funziona effettivamente senza alcuna libreria con codice conn.setRequestProperty ("Autorizzazione", "Base" + "" + token); – Daniel

+2

Questo non risponde alla domanda. Questa soluzione funziona per l'autenticazione di base ma non funziona per l'autenticazione Kerbos o NTLM come richiesto dalla domanda. –

0

Una soluzione compatibile per java.net.URLStreamHandler e java.net.URL è 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(); 

È inoltre possibile utilizzare java.net.Proxy all'interno di url.openConnection (proxy).

Usa Maven-Dipendenza:

<dependency> 
     <groupId>com.intersult</groupId> 
     <artifactId>http</artifactId> 
     <version>1.1</version> 
    </dependency> 
Problemi correlati