Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 通过JDBC以Windows用户身份验证SQL Server实例_Sql Server_Jdbc_Jtds_Windows Nt - Fatal编程技术网

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

Sql server 通过JDBC以Windows用户身份验证SQL Server实例,sql-server,jdbc,jtds,windows-nt,Sql Server,Jdbc,Jtds,Windows Nt,我必须为支持租户的web应用程序支持多种数据库类型。除此之外,我还通过使用net.sourceforge.jtds.jdbc.Driver类以及类似“jdbc:jtds:sqlserver://192.168.1.189:1433/ApplicationName". 这是可行的,但它要求用户在SQL Server实例中显式定义用户并启用SQL Server身份验证 现在,需求不可避免地发生了变化,我们应该支持通过Windows身份验证连接到SQL Server。显然,这需要对连接字符串进行某种更

我必须为支持租户的web应用程序支持多种数据库类型。除此之外,我还通过使用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=真;域=工作组
。这似乎使数据库服务器意识到我想作为Windows用户进行身份验证,但实际登录失败

The login is from an untrusted domain and cannot be used with Windows authentication. (code 18452, state 28000)
现在,在我的测试设置中,J2EE应用程序和SQL server实例实际上都在同一台机器上(尽管在生产中它们可能不是),而且这台计算机仍然不足以信任自己登录?很明显,我错过了这个谜题的一大部分。要使SQLServer实例相信启动它的用户实际上可以通过JDBC登录到它,您必须做些什么

编辑

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


是否有人知道如何通过JDBC使用定义为“Windows用户”的用户帐户访问SQL Server安装,从而形成一个J2EE应用程序,而不必使用Active Directory、运行web应用程序的Windows计算机和专有DLL?悬赏是为了解决这个子问题。整个问题显然过于宽泛,无法在一个论坛帖子中得到回答。

你所描述的显然是可行的。我的SQL Server 2008 R2 Express在一台独立服务器上运行,我能够通过jTDS 1.3.1在该服务器上使用Windows用户名/密码从单独的Windows计算机和Xubuntu 14.04框进行连接

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

“kilian”没有SQL登录,也没有使用该名称的数据库用户

然后,我在另外两台机器(Windows工作站和Xubuntu box)上运行了以下命令:

package com.example.jtdtest;
导入java.sql.*;
公共类JtdsTestMain{
公共静态void main(字符串[]args){
try(Connection con=DriverManager.getConnection(
“jdbc:jtds:sqlserver://192.168.1.137:52865/myDb" +
“域=任何”,
“基里安”,
“4赏金”)){
try(语句s=con.createStatement()){
String sql=“从ID=1的客户端选择LastName”;
try(ResultSet rs=s.executeQuery(sql)){
rs.next();
System.out.println(rs.getString(“LastName”);
}
}
}捕获(例外e){
e、 printStackTrace(系统输出);
}
}
}
补充说明:

  • 我不必包括
    useNTLMv2=true
    。无论是否使用该参数,我都能够连接

  • 我确实需要包含
    domain=
    来告诉SQL Server不要使用SQL身份验证,但我提供的实际值没有任何区别。(我字面上使用了“whatever”,它不是服务器的名称,也不是它所属的工作组的名称。)


替代方法

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

安全说明

您可能已经意识到了这一点,但只需要说,确保不要像前面演示中建议的那样向“经过身份验证的用户”授予对数据库的访问权限。确定应用程序运行时使用的用户帐户,并仅向数据库服务器中的特定用户授予访问权限

来源/其他信息

  • JDBC连接字符串配置上的MSDN文档()

主要问题是使用完整java解决方案(无DLL)进行windows身份验证。因此,您可以使用以下LIB之一:

  • NTLM身份验证:
  • 基于spring的Kerberos身份验证:
  • 另一个集成的windows身份验证库是SPNEGO(对此不太了解)

因此,一旦您的应用程序使用上述库之一进行了身份验证,您的JDBC应该可以使用“integratedSecurity=true”正常运行,如果需要,还可以使用“authenticationScheme=JavaKerberos”。

首先,您应该这样编写JDBC连接:

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

您需要在SQL Server Configuration Manager应用程序中启用SQL Server TCP/IP协议。您可以在SQL Server网络配置中看到协议。

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