【问题标题】:Connect To SQL Server With Windows Authentication From A Linux Machine Through JDBC通过 JDBC 从 Linux 机器连接到具有 Windows 身份验证的 SQL Server
【发布时间】:2016-10-16 14:20:46
【问题描述】:

我希望能够使用 jdbc 和 Windows 身份验证连接到 SQL Server。 我在互联网上看到一些答案说我应该在连接字符串中添加以下属性:

integratedSecurity=true;

还有添加

sqljdbc_auth.dll

到java路径。

但据我所知,这仅适用于我从 Windows 机器连接时。 当我在 Linux 机器上尝试这个时,我得到:

java.sql.SQLException: This driver is not configured for integrated authentication

我的问题是如何在 Linux 机器上执行此操作。

谢谢

【问题讨论】:

  • "dll" 暗示这可能是一个 Windows 库。在 Linux 上,您可能有一个“.so”或“dll”以外的其他内容。
  • @Fildor 我知道,这就是为什么我问我如何从 linux 中做到这一点。
  • @mjn 我读了这篇文章,但它适用于 Windows 而不是我问的 Linux
  • 我能够使用 jTDS 让它工作,正如我在回答 here 中所解释的那样。
  • 谢谢@GordThompson,我的问题是我不能使用 jTDS,因为我也使用 ssl,而且 jTDS 有一个错误会阻止使用 ssl。

标签: java sql-server jdbc windows-authentication


【解决方案1】:

好吧,最终我回答了我自己的问题: 这是不可能在使用 Microsoft JDBC 驱动程序的 Linux 机器上使用 Windows 身份验证的。 这可以通过使用以下连接字符串的 jTDS JDBC 驱动程序实现:

jdbc:jtds:sqlserver://host:port;databaseName=dbname;domain=domainName;useNTLMv2=true;

谢谢大家的cmets

【讨论】:

  • 我正在尝试实现相同的功能。我能够从 Unix 机器使用 jtDs 和 Windows 身份验证连接到 SqlServer,但插入查询失败。请求您查看this Stack Overflow 问题
  • 您如何在此连接字符串中证明用户身份验证详细信息?我需要在连接 url 中嵌入所有内容。
  • @Pradatta 要在连接字符串中提供用户和密码,只需将它们作为键值对添加到 URL 的末尾即可。 SQL Server 的模板 url 是:jdbc:jtds:://[:][/][;=[;...]] 和所以你的网址是 jdbc:jtds:sqlserver://host:port/database;user=someuser;password=somepass
  • @zuckermanori 谢谢。在发布此评论后,我完全通过随机猜测做到了这一点,而且它奏效了。非常感谢。
  • 感谢您的回答。
【解决方案2】:

TL;DR

无法对从 Linux 上运行的 JVM 到 MSSQL 的 JDBC 连接使用本机 Windows 身份验证。


这篇 MSDN 文章解释了在 Linux 上使用 JDBC 的身份验证方法、潜在错误和可用选项:

https://blogs.msdn.microsoft.com/psssql/2015/01/09/jdbc-this-driver-is-not-configured-for-integrated-authentication/

...在 JDBC 4.0 驱动中,可以使用 authenticationScheme 连接属性以指示您希望如何使用 Kerberos 连接到 SQL。这里有两个设置。

  • NativeAuthentication(默认)- 这使用 sqljdbc_auth.dll 并且特定于 Windows 平台。这是唯一的选择 在 JDBC 4.0 驱动程序之前。

  • JavaKerberos – 利用 Java API 调用 kerberos,不依赖于 Windows 平台。这是 java 特有的,而不是 绑定到底层操作系统,因此可以在两者上使用 Windows 和 Linux 平台。

...

以下文档概述了如何将 Kerberos 与 JDBC 一起使用 驱动程序并介绍使 JavaKerberos 正常工作所需的内容 正确。

使用 Kerberos 集成身份验证连接到 SQL Server http://msdn.microsoft.com/en-us/library/gg558122%28v=sql.110%29.aspx

【讨论】:

  • 我也读过这篇文章。我仍然不明白是否可以使用 JavaKerberos 标志通过 Windows 身份验证进行身份验证。
  • @zuckermanori Kerberos 身份验证需要 Kerberos 服务器。它是与本机 Windows 身份验证不同的标准。因此,如果 Kerberos 可用于您的环境,您需要先咨询您的系统/网络管理员。
  • 我知道这是不同的,我正在寻找一种使用 Windows 身份验证的方法,而不是 kerberos。无论如何,谢谢。
  • Kerberos 可以(并且确实)通过 LDAP(通常)与 Active Directory 一起工作。如果您可以配置 Kerberos 并与您的 Active Directory 服务通信,那么您应该能够通过它向您的 MS SQL Server 进行身份验证。我正在证明这是否有效(或无效)。
  • @Mishter_Jingles - 从来没有时间研究 kerberos 解决方案(增加了我现在没有时间解决的复杂程度)。我会在某个时候再试一次。只是现在不行。
【解决方案3】:

我知道这是一个较老的话题,但万一 Google 派人来这里:

SQL Server 有两个主要的 JDBC 驱动程序。一个来自 Microsoft,另一个来自 jTDS。令人惊讶的是,jTDS 可以使用 Windows auth (NTLM) 从其他平台(包括 Linux)进行连接,如下所述:http://jtds.sourceforge.net/faq.html#windowsAuth。当然,它也可以使用经过 SQL 身份验证的登录。在任何操作系统上使用 SQL 身份验证登录都不会比其他任何操作系统更难使用,所以不要忘记这些选项。

Microsoft 提供的版本是 @mjn 从文档中引用的版本。它可以通过指定integratedSecurity=trueauthenticationScheme=javaKerberosauthentication=NotSpecified 使用Windows 身份验证进行连接。

即使您不费尽心机地发现更多混乱,也很难让这项工作正常进行,因此请始终牢记您使用的是哪个驱动程序 - 并在这些帖子中告诉我们,以便您获得更具体的信息帮助。

【讨论】:

  • 获取`WARN AuthenticationJNI:无法加载sqljdbc_auth.dll`,
    Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: This driver is not configured for integrated authentication.
【解决方案4】:

对于使用 DBeaver 的用户,连接 SQL Server 数据库的方法是:

为了使用 DBeaver 从 Linux Debian 连接到 SQL Server

1.- 选择 SQL Server jTDS 驱动程序

2.- 输入连接信息

3.- 转到驱动程序属性选项卡并添加域、用户、密码

作为一个注释,在一些帖子中,我发现他们需要将属性 USENTLMV2 更改为 TRUE,但是通过将 USERTLNMV2 设置为 true 或 false,它对我有用。

我发现的一个问题是,当我尝试使用我的用户名和密码连接到数据库时,抛出了下一个错误:

登录失败。登录来自不受信任的域,不能用于 Windows 身份验证。

由于我的用户即将过期而引发此错误。我尝试了另一个 AD 用户,它可以连接。

【讨论】:

  • 太棒了!为我工作!我确实必须将 USERTLNMV2 设置为 true
【解决方案5】:

此 JDBC URL 经验证可与最新的 Microsoft SQL Server JDBC 驱动程序一起使用:

jdbc:sqlserver://[server]:[port];database=[db\;trustServerCertificate=true;integratedSecurity=true;user=[user without domain];password=[pw];authenticationScheme=NTLM;domain=[domain];authentication=NotSpecified

例子:

jdbc:sqlserver://mysql.myorg.com:1433;database=mydb;trustServerCertificate=true;integratedSecurity=true;user=myuser;password=mypwd;authenticationScheme=NTLM;domain=ad.myorg.com;authentication=NotSpecified

【讨论】:

  • 这会自动信任服务器证书,从安全角度不推荐。
【解决方案6】:

我能够在 Windows 10 上运行的 Ubuntu Linux Docker 映像上使用以下脚本使用 Windows 身份验证连接到 SQL Server 2016 数据集市和 JDBC 连接 Microsoft JDBC 驱动程序。

# initializes spark session
from pyspark.sql import SparkSession
spark = SparkSession\
    .builder\
    .master('local[*]')\
    .appName('FDM')\
    .config("spark.driver.extraClassPath","pyspark_jars/*")\
    .config('spark.executor.memory', '4g')\
    .config('spark.driver.memory', '16g')\
    .config('spark.executor.cores', '4')\
    .getOrCreate()

jdbc_url = '''jdbc:sqlserver://SERVER;databaseName=DBNAME;trustServerCertificate=true;integratedSecurity=true;user=USERID;password=PASSWORD;authenticationScheme=NTLM;domain=US;authentication=NotSpecified'''


spark_df = spark.read\
    .format("jdbc")\
    .option("url", jdbc_url)\
    .option("driver","com.microsoft.sqlserver.jdbc.SQLServerDriver")\
    .option("query", 'select top(1000) * from SCHEMA.TABLE')\
    .option("fetchsize", 100000)\
    .load()

spark_df.write.csv('TEST.csv', mode = "overwrite", header=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    相关资源
    最近更新 更多