sql-server - 通过 JDBC 作为 Windows 用户对 SQL Server 实例进行身份验证

标签 sql-server jdbc jtds windows-nt

我必须为支持租户的 Web 应用程序支持多种数据库类型。其中,我通过使用 net.sourceforge.jtds.jdbc.Driver 类和连接字符串(如“jdbc:jtds:sqlserver://192.168.1.189:1433/ApplicationName”)成功支持了 Microsoft 的 SQL Server。这可行,但需要用户在 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 Server 实例实际上都在同一台计算机上(尽管在生产中它们可能不是),并且这台计算机仍然不够可信,无法登录本身?显然我在这里遗漏了这个难题的很大一部分。要让 SQL Server 实例相信启动它的用户实际上可以通过 JDBC 登录到它,需要做什么?

编辑

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

有谁知道如何通过JDBC形式使用定义为“Windows用户”的用户帐户访问SQL Server安装吗? J2EE 应用程序,无需使用 Active Directory、运行 Web 应用程序的 Windows 计算机和专有 DLL?赏金适用于该子问题的任何解决方案。整个问题显然过于广泛,无法在一篇论坛帖子中得到解答。

最佳答案

我遇到了错误

The login is from an untrusted domain and cannot be used with Windows authentication

当 2012 SQL Server 数据库实例最近升级到 2016 时。为了将基于 AD 的身份验证与 JTDS 驱动程序和 SQL Server 2016 结合使用,似乎有必要同时指定 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

更新

最近(由于大流行封锁),我发现自己还必须使用 Windows 身份验证从非域计算机(通过 VPN)连接到 SQL Server。这可以通过启动 Windows 进程来初始化 SQL Server 连接来完成,例如Eclipse/Spring Tool Suite,使用以下命令:

C:\Windows\System32\runas.exe /netonly /user:domain\user "path_to_executable.exe"

来源:https://www.mssqltips.com/sqlservertip/3250/connect-to-sql-servers-in-another-domain-using-windows-authentication/

在发现这个 gem 的过程中,我还发现需要使用加密。以下是我正在使用的设置(除了现在使用/netonly 和域帐户运行可执行文件之外):

spring.datasource.url=jdbc:jtds:sqlserver://fqdn_of_server_including_domain/DBNAME;domain=mydomain;useNTLMv2=true;ssl=require;prepareSQL=2;
spring.datasource.username=domainaccountname_without_domain_prefix
spring.datasource.password=password
spring.datasource.testOnBorrow=true
spring.datasource.hikari.connection-test-query=SELECT 1
spring.jpa.database-platform=org.hibernate.dialect.SQLServerDialect

关于sql-server - 通过 JDBC 作为 Windows 用户对 SQL Server 实例进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26274472/

相关文章:

java - 使用 JTDS 和 Scala 时出现不支持的版本错误

mysql - 如果不存在如何添加新列

sql-server - 是否可以在 SQL 查询中定义本地函数?

SQL IsNumeric 不起作用

java - ORA-00911 : invalid character error while executing a query

java - 如何使用字符数组密码进行jtds连接

SQL 空值内连接

java - 是否可以收集语句执行期间创建的行?

Java DB 查询和 C3P0 用于并发调用

Java jTDS 连接问题 Ubuntu 服务器