通过JDBC以SQL用户身份验证SQL Server实例

问题描述 投票:9回答:7

我必须为支持租户的Web应用程序支持多种数据库类型。其中,我已成功支持Microsoft的SQL Server,使用net.sourceforge.jtds.jdbc.Driver类和连接字符串,如“jdbc:jtds:sqlserver://192.168.1.189:1433 / ApplicationName”。这有效,但它要求用户在SQL Server实例中明确定义用户并启用SQL Server身份验证。

现在,不可避免地,需求发生了变化,我们应该支持通过Windows身份验证连接到SQL Server。显然,这需要对连接字符串进行某种更改,因为数据库服务器必须能够以某种方式区分传递到数据库连接的凭据是针对在SQL Server安装中还是在Windows操作系统中定义的用户。但它是什么?

根据互联网的建议,如果进展到扩展连接字符串与;useNTLMv2=true;domain=WORKGROUP。这似乎使数据库服务器意识到我想要作为Windows用户进行身份验证,但实际的登录失败了

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

现在我的测试设置,J2EE应用程序和SQL服务器实例实际上都在同一台机器上(虽然在生产中它们可能不是),而且这台计算机还不足以登录自己?显然我在这里错过了很大一部分难题。为了说服SQL Server实例启动它的用户实际上可以通过JDBC登录它,必须做些什么呢?

编辑

由于我们已经尝试将我们的Web应用程序与完整的Microsoft基础架构堆栈(SQL Server,Active Directory,域名服务...)集成太多不成功,我必须限制此问题:

有没有人知道通过JDBC形式的J2EE应用程序使用定义为“Windows用户”的用户帐户访问SQL Server安装的方法,而不必使用Active Directory,运行Web应用程序的Windows机器和专有DLL?赏金是针对该子问题的任何解决方案。整个问题显然过于宽泛,无法在一篇论坛帖子中得到解答。

sql-server jdbc jtds windows-nt
7个回答
3
投票

你所描述的肯定似乎是可行的。我在独立服务器上运行SQL Server 2008 R2 Express,并且我能够通过jTDS 1.3.1从单独的Windows机器和Xubuntu 14.04机箱使用Windows用户名/密码进行连接。

在运行SQL Server的计算机上,我创建了一个名为“kilian”的Windows用户。在SQL Server本身中,我为NT AUTHORITY\Authenticated Users创建了一个SQL登录。然后在数据库(名为'myDb')中,我为该SQL登录创建了一个名为'AuthenticatedUsers'的用户。为了简单起见,我在数据库上为该用户提供了db_owner权限。

'kilian'没有SQL登录,没有具有该名称的数据库用户。

然后,从其他两台机器(Windows工作站和Xubuntu盒)我刚刚运行:

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

    }

}

补充说明:

  • 我不必包括useNTLMv2=true。我能够连接或不连接该参数。
  • 我必须包括domain=告诉SQL Server不要使用SQL身份验证,但我提供的实际值没有区别。 (我实际上使用'what',这不是服务器的名称或它所属的工作组的名称。)

2
投票

我遇到了错误

登录来自不受信任的域,不能与Windows身份验证一起使用

最近将2012 SQL Server数据库实例升级到2016时。为了对JTDS驱动程序和SQL Server 2016使用基于AD的身份验证,似乎需要同时指定useNTLMv2=truedomain=example.com后缀以建立连接。域名是绝对必要的,我通过测试证实了这一点。这是JTDS驱动程序版本1.3.1。

使用基于AD的身份验证到具有JTDS 1.3.1的SQL Server 2016 DB的工作连接字符串示例:

jdbc:jtds:sqlserver://sqlserver2016db.example.com/MY_DB_NAME;domain=example.com;prepareSQL=2;useNTLMv2=true

1
投票

替代方法

替代解决方案是利用集成安全性。这使您的应用程序能够以当前运行应用程序的用户身份连接到数据库。通过将integratedSecurity=true;添加到连接字符串属性中来启用此功能。如果遇到任何问题,请确保可以通过类路径或应用程序库访问sqljdbc_auth.dll。

安全说明

您可能已经意识到了,但只需要确保不要像以前建议的那样向数据库授予对“Authenticated Users”的访问权限。确定应用程序运行的用户帐户,并仅授予对数据库服务器中该特定用户的访问权限。

来源/其他信息


1
投票

主要问题是使用完整的java解决方案(无DLL)进行Windows身份验证。所以你可以使用下面的一个库:

因此,一旦您的应用程序使用上面的一个lib进行身份验证,您的JDBC就可以使用“integratedSecurity = true;”运行正常如果需要“authenticationScheme = JavaKerberos”。


1
投票

首先你应该写这样的jdbc连接:

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

然后

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.


1
投票

我可以看到两种可能性,1。您正在使用服务器无法理解的本地系统帐户在这种情况下,请切换到域帐户。

  1. Windows身份验证具有不同的凭据要求,您可能无法满足这些要求。在这种情况下,请尝试更改密码以符合要求。

两者都很有可能发生。


1
投票

请参阅其他SO post,其中介绍了如何通过JDBC从Linux机器连接到带有Windows身份验证的SQL Server


0
投票

这是我为jTDS驱动程序设置的NiFi:

数据库连接URL:jdbc:jtds:sqlserver://192.168.1.189:1433;DOMAIN=domain_name

我不需要添加useNTLMv2=true,但大多数人需要,所以如果它不起作用你也可以尝试:jdbc:jtds:sqlserver://192.168.1.189:1433;DOMAIN=domain_name;useNTLMv2=true

数据库驱动程序类名称:net.sourceforge.jtds.jdbc.Driver

数据库用户:domain_user_name (**without** @domain)密码:domain_password

验证查询:select 1

© www.soinside.com 2019 - 2024. All rights reserved.