Подключение к 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, возможные ошибки и доступные опции:

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

Я знаю, что это довольно старая тема, но на случай, если 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)
Другие вопросы по тегам