Подключение к SQL Server с аутентификацией Windows с компьютера Linux через JDBC
Я хочу иметь возможность подключиться к SQL Server с использованием аутентификации jdbc и windows. Я видел несколько ответов в интернете, в которых говорилось, что я должен добавить следующее свойство в строку подключения:
integratedSecurity=true;
А также добавить
sqljdbc_auth.dll
К пути Java.
Но это, насколько я понимаю, применимо только тогда, когда я подключаюсь с компьютера с Windows. Когда я пытаюсь сделать это на компьютере с Linux, я получаю:
java.sql.SQLException: This driver is not configured for integrated authentication
У меня вопрос, как мне сделать это с Linux-машины.
Спасибо
6 ответов
Ну, в конце концов я отвечаю на свой собственный вопрос: невозможно использовать проверку подлинности Windows на компьютере с Linux, используя драйвер Microsoft JDBC. Это возможно с помощью драйвера jTDS JDBC, используя следующую строку подключения:
jdbc:jtds:sqlserver://host:port;databaseName=dbname;domain=domainName;useNTLMv2=true;
Спасибо всем за все комментарии
Для тех, кто использует DBeaver, способ подключения к базе данных SQL Server:
Для того, чтобы подключиться к SQL Server из Linux Debian с помощью DBeaver
1.- Выберите драйвер SQL Server jTDS
2.- Введите информацию о соединении
3.- Перейдите на вкладку Свойства драйвера и добавьте домен, пользователя, пароль
Просто в качестве заметки, в каком-то посте я обнаружил, что им нужно изменить свойство USENTLMV2 на TRUE, но у меня это сработало, либо установив USERTLNMV2 в true или false.
Проблема, которую я обнаружил, заключалась в том, что, когда я пытался подключиться к базе данных, используя свой пароль и пользователя, была выдана следующая ошибка:
Ошибка входа. Логин входит в ненадежный домен и не может использоваться с аутентификацией Windows.
Эта ошибка возникла из-за истечения срока действия моего пользователя. Я пытался с другим пользователем AD, и он мог подключиться.
TL;DR
Невозможно использовать встроенную проверку подлинности Windows для соединений JDBC с MSSQL из JVM, работающей в Linux.
В этой статье MSDN объясняются методы аутентификации с JDBC в Linux, возможные ошибки и доступные опции:
... в драйвере 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
Я знаю, что это довольно старая тема, но на случай, если Google отправит сюда людей:
Есть два основных драйвера JDBC для SQL Server. Один из Microsoft, а другой из jTDS. Удивительно, но jTDS может подключаться с использованием аутентификации Windows (NTLM) с других платформ, включая Linux, как описано здесь: http://jtds.sourceforge.net/faq.html. Конечно, он также может использовать вход с аутентификацией SQL. Имена входа с проверкой подлинности в SQL не сложнее использовать в любой операционной системе, чем в любой другой, поэтому не забывайте о них.
Версия, предоставленная Microsoft, является той, из которой @mjn предоставил цитату из документации. Он может подключиться с помощью проверки подлинности Windows, указав integratedSecurity=true
, authenticationScheme=javaKerberos
, а также authentication=NotSpecified
,
Трудно заставить это работать, даже если вы не выходите из своего пути, чтобы найти больше путаницы, поэтому всегда помните, какой драйвер вы используете - и сообщите нам в этих сообщениях, чтобы вы могли получить более конкретную помощь.
Этот URL-адрес JDBC проверен для работы с последним драйвером JDBC Microsoft SQL Server:
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
Мне удалось подключиться к SQL Server 2016 Data Mart и соединению JDBC Драйвер Microsoft JDBC с использованием проверки подлинности Windows с помощью следующего сценария в образе Docker Ubuntu Linux, работающем в Windows 10.
# 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)