2014-10-09 12 views
7

Tôi phải hỗ trợ nhiều loại cơ sở dữ liệu cho ứng dụng web hỗ trợ người thuê của mình. Trong số những người khác, tôi đã hỗ trợ thành công SQL Server của Microsoft, bằng cách sử dụng lớp net.sourceforge.jtds.jdbc.Driver với một chuỗi kết nối như "jdbc: jtds: sqlserver: //192.168.1.189: 1433/ApplicationName". Điều này làm việc, nhưng nó đòi hỏi người dùng xác định rõ ràng một người dùng trong cá thể SQL Server và cho phép xác thực SQL Server.Xác thực đối tượng SQL Server là Người dùng Windows thông qua JDBC

Bây giờ, chắc chắn, các yêu cầu đã thay đổi và chúng tôi phải hỗ trợ kết nối với SQL Server thông qua Xác thực Windows. Rõ ràng điều này đòi hỏi một số thay đổi đối với chuỗi kết nối, vì máy chủ cơ sở dữ liệu phải bằng cách nào đó có thể phân biệt liệu thông tin xác thực được chuyển vào kết nối cơ sở dữ liệu có dành cho người dùng được xác định trong cài đặt SQL Server hay trong hệ điều hành Windows hay không. Nhưng nó là gì?

Làm theo lời khuyên từ internet, nếu tiến triển đến khi mở rộng chuỗi kết nối với ;useNTLMv2=true;domain=WORKGROUP. Đó dường như để làm cho máy chủ cơ sở dữ liệu nhận thức được rằng tôi muốn để xác thực như một người dùng Windows, nhưng thực tế log-in không thành công với

The login is from an untrusted domain and cannot be used with Windows authentication. (code 18452, state 28000) 

Bây giờ im thử nghiệm của tôi thiết lập, cả hai ứng dụng J2EE và Ví dụ máy chủ SQL trên thực tế là trên cùng một máy (mặc dù trong sản xuất chúng có thể không), và máy tính này vẫn chưa đủ tin cậy để đăng nhập vào chính nó? Rõ ràng là tôi đang thiếu một phần lớn của câu đố ở đây. Người ta phải làm gì để thuyết phục một cá thể SQL Server mà người dùng đã bắt đầu nó có thể thực sự đăng nhập vào nó thông qua JDBC?

Sửa

Kể từ khi chúng tôi đã chìm quá nhiều nỗ lực không thành công cố gắng để tích hợp ứng dụng web của chúng tôi với một chồng đầy đủ Microsoft cơ sở hạ tầng (SQL Server, Active Directory Domain Name Service ...), tôi phải hạn chế câu hỏi này:

có ai biết một cách để truy cập vào một SQL server cài đặt với một tài khoản người dùng định nghĩa là một "người dùng Windows" qua JDBC dạng một ứng dụng J2EE, mà không cần phải sử dụng Active Directory, một máy Windows chạy ứng dụng web và một tệp DLL độc quyền? Tiền thưởng là cho bất kỳ giải pháp của vấn đề phụ đó. Toàn bộ vấn đề rõ ràng là quá rộng để được trả lời trong một bài đăng trên diễn đàn.

+1

là máy tính này một thành viên của một miền Active Directory Windows? Tôi không biết nhiều về trình điều khiển jTDS nhưng bạn đã cài đặt các dấu hiệu duy nhất trên DLL? Một tùy chọn khác là trình điều khiển Microsoft JDBC, hỗ trợ Windows auth mà không có SSO. –

+0

Không, tất cả những gì chúng tôi có ở đây là một vài hộp phát triển Windows độc lập. Một đồng nghiệp hiện đang xem xét những gì chúng tôi sẽ phải làm để thiết lập môi trường Active Directory cho chính mình. Ngoài ra, tôi có hiểu bạn một cách chính xác rằng với trình điều khiển sqljdbc4.jar tôi có thể lấy đi mà không cần chạy bộ kiểm soát miền cục bộ? Nếu vậy, tôi thực sự muốn nhận được kết nối bằng cách chỉ thích ứng với URL kết nối và các tham số thay thế. –

+0

Lưu ý rằng việc chạy SQL Server trên bộ kiểm soát miền không được hỗ trợ. Thông thường, một sử dụng xác thực Windows chỉ với AD đã có sẵn. Nếu bạn không có điều đó, tại sao không chỉ sử dụng SQL auth? Tại sao một yêu cầu yêu cầu bạn sử dụng xác thực Windows mà không có cơ sở hạ tầng hỗ trợ? –

Trả lời

2

Những gì bạn mô tả chắc chắn có vẻ khả thi. Tôi có SQL Server 2008 R2 Express chạy trên một máy chủ độc lập và tôi đã có thể kết nối bằng tên người dùng/mật khẩu Windows trên máy chủ đó qua jTDS 1.3.1 từ một máy Windows riêng biệt và từ một hộp Xubuntu 14.04.

Trên máy đang chạy SQL Server, tôi đã tạo người dùng Windows có tên 'kilian'. Trong chính SQL Server, tôi đã tạo một Đăng nhập SQL cho NT AUTHORITY\Authenticated Users. Sau đó, trong cơ sở dữ liệu (có tên 'myDb'), tôi đã tạo một Người dùng có tên là 'AuthenticatedUsers' cho Đăng nhập SQL đó. Để giữ cho mọi thứ đơn giản, tôi đã cấp cho người dùng quyền db_owner đó trên cơ sở dữ liệu.

DatabaseUser.png

Không có SQL Login cho 'Kilian' và không có cơ sở dữ liệu người dùng với tên đó.

Sau đó, từ hai máy khác (máy trạm Windows và Xubuntu hộp) Tôi chỉ cần chạy này:

package com.example.jtdstest; 

import java.sql.*; 

public class JtdsTestMain { 

    public static void main(String[] args) { 
     try (Connection con = DriverManager.getConnection(
       "jdbc:jtds:sqlserver://192.168.1.137:52865/myDb" + 
        ";domain=whatever", 
       "kilian", 
       "4theBounty")) { 
      try (Statement s = con.createStatement()) { 
       String sql = "SELECT LastName FROM Clients WHERE ID=1"; 
       try (ResultSet rs = s.executeQuery(sql)) { 
        rs.next(); 
        System.out.println(rs.getString("LastName")); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(System.out); 
     } 

    } 

} 

Ghi chú thêm:

  • Tôi không phải bao gồm useNTLMv2=true. Tôi đã có thể kết nối có hoặc không có tham số đó.

  • I đã làm phải bao gồm domain= để yêu cầu SQL Server không sử dụng xác thực SQL, nhưng giá trị thực tế tôi cung cấp không có sự khác biệt. (Tôi nghĩa là sử dụng 'bất cứ điều gì', mà không phải là tên của máy chủ hoặc tên của workgroup mà nó thuộc về.)

0

Phương pháp thay thế

Các giải pháp thay thế là sử dụng tích hợp Bảo vệ. Điều này cho phép ứng dụng của bạn kết nối với cơ sở dữ liệu với tư cách là người dùng mà ứng dụng hiện đang chạy. Điều này được bật bằng cách thêm integratedSecurity=true; vào thuộc tính chuỗi kết nối. Nếu bạn gặp phải bất kỳ sự cố nào, hãy đảm bảo rằng sqljdbc_auth.dll có thể truy cập được thông qua classpath hoặc trong thư viện ứng dụng của bạn.

an Note

Bạn có thể đã biết, nhưng chỉ có thể nói chắc chắn rằng không cấp quyền truy cập vào "Authenticated Users" để cơ sở dữ liệu của bạn như đề xuất trước đây như là một phần của cuộc biểu tình. Xác định tài khoản người dùng nào ứng dụng của bạn chạy và cấp quyền truy cập cho chỉ người dùng cụ thể đó trong máy chủ cơ sở dữ liệu của bạn.

Nguồn/Thông tin cá

0

Vấn đề chính là việc chứng thực các cửa sổ với một giải pháp java đầy đủ (không có DLL). Vì vậy, bạn có thể sử dụng một trong những libs dưới đây:

Vì vậy, khi ứng dụng của bạn được xác thực bằng một trong các lib ở trên, JDBC của bạn sẽ chạy tốt bằng cách sử dụng "integratedSecurity = true;" và nếu cần "authenticationScheme = JavaKerberos".

0

Trước hết bạn nên viết kết nối jdbc như thế này:

String url ="jdbc:sqlserver://PC01\inst01;databaseName=DB01;integratedSecurity=true"; 

sau đó

you need to enable the SQL Server TCP/IP Protocol in Sql Server Configuration Manager app. You can see the protocol in SQL Server Network Configuration.

0

tôi có thể thấy hai khả năng, 1. Bạn đang sử dụng một tài khoản hệ thống cục bộ mà máy chủ sẽ không hiểu Trong trường hợp này, hãy chuyển sang tài khoản miền.

  1. Xác thực Windows có các yêu cầu chứng chỉ khác nhau và bạn có thể không đáp ứng các yêu cầu đó. Trong trường hợp này, hãy thử thay đổi mật khẩu để phù hợp với yêu cầu.

Rất có thể cả hai đều đang xảy ra.

0

thấy SO post này khác mà mô tả làm thế nào để kết nối với một SQL Server với Windows Authentication từ một máy Linux thông qua JDBC

Các vấn đề liên quan