通过JDBC从Linux机器进行Windows身份验证连接到SQL Server

时间:2016-06-15 12:47:30

标签: java sql-server jdbc windows-authentication

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

integratedSecurity=true;

并添加

sqljdbc_auth.dll

到java路径。

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

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

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

由于

6 个答案:

答案 0 :(得分:31)

好吧,最后我回答了我自己的问题: 无法使用Microsoft JDBC驱动程序从Linux计算机使用Windows身份验证。 可以使用以下连接字符串使用jTDS JDBC驱动程序:

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

感谢大家的所有评论

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

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

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

即使您不竭尽全力寻找更多的困惑,也很难使它正常工作,因此请始终记住您使用的是哪个驱动程序-在这些帖子中告诉我们,以便您可以更具体帮助。

答案 3 :(得分:0)

对于那些使用DBeaver的人,连接到SQL Server数据库的方式是:

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

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

enter image description here

2.-输入连接信息

enter image description here

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

enter image description here

enter image description here

仅作说明,在一些帖子中,我发现他们需要将属性USENTLMV2更改为TRUE,但通过将USERTLNMV2设置为true或false对我来说都是有效的。

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

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

enter image description here

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

答案 4 :(得分:0)

此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

答案 5 :(得分:0)

我能够使用 Windows 身份验证在 Windows 10 上运行的 Ubuntu Linux Docker 映像上使用以下脚本连接到 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)