2009-07-22 40 views
5

Tôi cần sử dụng dịch vụ web còn lại với java, chuyển thông tin đăng nhập của tài khoản người dùng miền.xác thực bằng ntlm (hoặc kerberos) bằng cách sử dụng java UrlConnection

ngay bây giờ tôi đang làm nó với asp cổ điển


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

và với 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(); 

làm thế nào tôi có thể đạt được điều này với java? Hãy xem xét rằng tôi không sử dụng thông tin đăng nhập của người dùng hiện đang đăng nhập, tôi đang chỉ định tài khoản miền (Tôi có mật khẩu)

hãy cho tôi biết nó dễ dàng như với asp cổ điển và asp.net .. ..

Trả lời

0

Theo this page, bạn có thể sử dụng lớp JRE tích hợp, với thông báo trước rằng phiên bản Java chỉ có thể thực hiện điều này trên máy Windows.

Tuy nhiên, nếu bạn sẵn sàng sống với sự phụ thuộc của bên thứ ba, IMO Apache Commons HttpClient 3.x là cách để thực hiện. Here là tài liệu hướng dẫn sử dụng xác thực, bao gồm NTLM. Nói chung, HttpClient là một thư viện chức năng hơn nhiều.

Phiên bản mới nhất của HttpClient là 4.0, nhưng dường như phiên bản này does not support NTLM phiên bản này requires a tiny bit of extra work.

Dưới đây là những gì tôi nghĩ mã sẽ như thế nào, mặc dù tôi đã không thử nó:

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

Chúc may mắn.

+0

Hey Matt, thanks a lot cho câu trả lời của bạn, nhưng tôi tự hỏi, nếu nó có thể làm điều này, với buil-in lớp JRE, sử dụng Kerberos thay vì NTLM .. Ý tôi là, kerberos không phải là công cụ phổ biến như NTLM ... – opensas

+0

Cuối cùng tôi nghe nói, máy khách Apache KHÔNG hỗ trợ NTLMv2. Và họ không muốn khai thác JCIFS bởi vì a) họ tuyên bố rằng LGPLv2 không tương thích với giấy phép của họ và b) nói chung họ rất mệt mỏi với công cụ MS. Nhưng nó không quan trọng bởi vì nếu bạn muốn interop với Microsoft, NTLM là mẫu số chung của cơ chế xác thực.Kerberos không hoạt động nếu máy khách không có quyền truy cập vào bộ điều khiển miền hoặc nếu đồng bộ hóa thời gian bị tắt hoặc nếu DNS không hoàn toàn đúng hoặc ... v.v. – user8134

+0

Xin chào ioplex. Tôi không chắc chắn nơi bạn nghe điều này, nhưng nó là không chính xác. Vui lòng xem tài liệu tôi đã liên kết. Tôi đã sử dụng thành công NTLM với cả HttpClient 3.x và với 4.0. –

-2

Hãy xem lớp SpnegoHttpURLConnection trong dự án Bộ lọc Servlet HTTP SPNEGO. Dự án này cũng có một số ví dụ.

Dự án này có một số client library mà bạn thực hiện rất nhiều trong ví dụ của mình.

Hãy xem ví dụ này từ 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

thực sự hoạt động với bất kỳ thư viện nào có mã conn.setRequestProperty ("Ủy quyền", "Cơ bản" + "" + mã thông báo); – Daniel

+2

Điều này không trả lời được câu hỏi. Giải pháp này hoạt động cho xác thực cơ bản nhưng không hoạt động đối với xác thực Kerbos hoặc NTLM khi câu hỏi yêu cầu. –

0

Một giải pháp tương thích cho java.net.URLStreamHandler và java.net.URL là 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(); 

Bạn cũng có thể sử dụng java.net.Proxy trong url.openConnection (proxy).

Sử dụng Maven-phụ thuộc:

<dependency> 
     <groupId>com.intersult</groupId> 
     <artifactId>http</artifactId> 
     <version>1.1</version> 
    </dependency> 
Các vấn đề liên quan