我希望能够使用jdbc和Windows身份验证连接到SQL Server。 我在网上看到一些答案,说我应该将以下属性添加到连接字符串中:
integratedSecurity=true;
并添加
sqljdbc_auth.dll
到java路径。
但据我所知,只有当我从Windows机器连接时才适用。 当我在Linux机器上尝试这个时,我得到:
java.sql.SQLException: This driver is not configured for integrated authentication
我的问题是如何从Linux机器上执行此操作。
由于
答案 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的身份验证方法,潜在错误和可用选项:
...在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=true
,authenticationScheme=javaKerberos
和authentication=NotSpecified
,可以使用Windows身份验证进行连接。
即使您不竭尽全力寻找更多的困惑,也很难使它正常工作,因此请始终记住您使用的是哪个驱动程序-在这些帖子中告诉我们,以便您可以更具体帮助。
答案 3 :(得分:0)
对于那些使用DBeaver的人,连接到SQL Server数据库的方式是:
为了使用DBeaver从Linux Debian连接到SQL Server
1。-选择SQL Server jTDS驱动程序
2.-输入连接信息
3.-转到“驱动程序属性”选项卡并添加域,用户,密码
仅作说明,在一些帖子中,我发现他们需要将属性USENTLMV2更改为TRUE,但通过将USERTLNMV2设置为true或false对我来说都是有效的。
我发现的一个问题是,当我尝试使用用户名和密码连接到数据库时,抛出了下一个错误:
登录失败。该登录名来自不受信任的域,不能与Windows身份验证一起使用。
由于我的用户即将到期,引发了此错误。我尝试了另一个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)