设置 ADAL/MSAL 以使用 Matlab 连接到 Azure 数据库

Setting up ADAL/MSAL for connecting to Azure database with Matlab

使用 Matlab 及其数据库工具箱,我需要连接到使用 Microsoft SQL 的 Azure 服务器,使用 Azure ActiveDirectoryPassword 身份验证模式。但是,本机不支持 Azure 活动目录连接,需要一些额外的步骤。 Matlab 使用 Java,因此我需要通过 Java 驱动程序和库来建立与我的数据库的连接。在我尝试解决此问题的最新迭代中,我遇到了以下连接错误:JDBC Driver Error: Failed to load ADAL4J Java library for performing ActiveDirectoryPassword authentication.

通过这个有点相关的问题:https://forum.knime.com/t/connect-to-azure-database/20585, I was referred to the Microsoft page on how to setup the connection: https://docs.microsoft.com/en-us/sql/connect/jdbc/connecting-using-azure-active-directory-authentication?view=sql-server-ver15。此页面上的说明告诉我 On the client machine (on which, you want to run the example), download the azure-activedirectory-library-for-java library and its dependencies, and include them in the Java build path.

随后,Microsoft 网页将我转到 Github 页面,以安装 ADAL 库。

现在,混乱仍在继续,因为我对下一步该做什么一无所知。我不知道任何 Java,我什至没有直接使用 Java,因为一切都是通过在后台使用 Java 的 Matlab 功能运行的(我唯一做的就是使用连接URL 设置与数据库的连接)。 ADAL/MSAL Github 上的帮助文件对于像我这样的新手来说不是很清楚,而且似乎并不专注于帮助简单的 Windows 用户设置所有库。所以我正在寻求帮助以获得一切 运行.

目前运行是什么?

我的问题:

  1. 我使用 ADAL or MSAL 吗?
  2. 如何将我需要的库包含在 Java 中以便 Matlab 可以使用它?

我尝试了什么:

任何帮助将不胜感激,谢谢!

在向 MathWorks 进一步询问后,我能够解决我的问题。主要问题是我缺少 ADAL 库及其所有依赖项。安装它们之后,我能够连接到数据库。最后,这是让一切正常运行的设置。

  • Java: 起初我们安装了 AdoptOpenJDK Java,但那是一个错误,没有必要
    • 我做了什么:我回滚到原生 Matlab Java。我删除了环境变量中对新 Java 的所有引用,这样 Matlab 只能使用它附带的默认 Java。
  • JDBC 驱动程序:是否必须使用 JDBC 驱动程序,或者您是否也可以使用 ODBC 连接?我不完全知道这个问题的答案。在 Matlab 中,似乎如果您想通过脚本以编程方式连接到数据库,您 need/want 可以使用 JDBC 驱动程序。虽然 MathWorks 支持人员没有明确说明,但他们也不建议使用 ODBC
    • 我做了什么:使用最新的 JDBC 驱动程序,它仍然支持默认的 Java 版本的 Matlab,Microsoft JDBC DRIVER 6.4 for SQL Server for Matlab 2017a(它仍然使用 Java 7 ) 和 Microsoft JDBC DRIVER 8.4 for SQL Server 用于 Matlab 2020a(它使用 Java 8)
  • ADAL 库:Matlab 需要 ADAL4J 库及其所有依赖项。由此我得出结论,使用 MSAL4J 是不可能的。我直接从 MathWork 获得了必要的库,所以我不知道如何获得它们。我使用的库是:
accessors-smart-1.2.jar
activation-1.1.jar
adal4j-1.6.3.jar
asm-5.0.4.jar
commons-codec-1.11.jar
commons-lang3-3.5.jar
gson-2.8.0.jar
javax.mail-1.6.1.jar
javax.servlet-api-4.0.1.jar
jcip-annotations-1.0-1.jar
json-smart-2.3.jar
lang-tag-1.5.jar
nimbus-jose-jwt-9.0.1.jar
oauth2-oidc-sdk-5.64.4.jar
slf4j-api-1.7.21.jar

答案的 Java/driver 相关部分到此结束。要在 Matlab 中设置所有内容,必须执行以下步骤。

  1. Matlab 需要知道 JDBC 驱动程序的安装位置以及 ADAL4J 库的位置
  2. 每个 Matlab 会话,您需要覆盖 Matlab 设置以避免 Matlab 强制 third-party Java 类 使用较旧的 Saxon Transformer。这个较旧的 Saxon Transformer 与 ADAL4J 不兼容。

解决方案:

  1. 在 Matlab 中执行命令 edit(fullfile(prefdir,'javaclasspath.txt'))。如果该文件尚不存在,系统将提示您创建该文件。在这种情况下允许 Matlab 创建文件。
  2. 在 .txt 文件中,输入以下行:
    <before>
    c:\full\path\to\accessors-smart-1.2.jar
    c:\full\path\to\activation-1.1.jar
    c:\full\path\to\adal4j-1.6.3.jar
    c:\full\path\to\asm-5.0.4.jar
    c:\full\path\to\commons-codec-1.11.jar
    c:\full\path\to\commons-lang3-3.5.jar
    c:\full\path\to\gson-2.8.0.jar
    c:\full\path\to\javax.mail-1.6.1.jar
    c:\full\path\to\javax.servlet-api-4.0.1.jar
    c:\full\path\to\jcip-annotations-1.0-1.jar
    c:\full\path\to\json-smart-2.3.jar
    c:\full\path\to\lang-tag-1.5.jar
    c:\full\path\to\nimbus-jose-jwt-9.0.1.jar
    c:\full\path\to\oauth2-oidc-sdk-5.64.4.jar
    c:\full\path\to\slf4j-api-1.7.21.jar
    c:\full\path\to\<SQL JDBC driver>.jre<relevant number for the java version you use>.jar
    
    • <before> 标签将确保库被添加到 Matlab 中静态 Java 路径的前面。
    • c:\full\path\to\ 替换为 Matlab 可以找到 JDBC 驱动程序和 ADAL4J 库的目录。
    • 对于 JDBC 驱动程序,select 对应于您的 Matlab 使用的 Java 版本的 .jar 文件。
  3. 保存 javaclasspath.txt 并重新启动 Matlab。使用命令window中的命令javaclasspath验证库是否添加到静态Java路径
  4. 对于每个 Matlab 版本,每个用户都需要重复步骤 1-3。但是也可以只设置一次。除了在用户的偏好目录中使用 javaclasspath.txt,您还可以在 Matlab 安装的 toolbox\local 目录中更新 classpath.txt。如果您选择更新 classpath.txt,只需将这些行添加到文件的顶部,不要使用 <before> 关键字。
  5. 每个 Matlab 会话,即每次启动 Matlab 时(是的,真的,每次),在连接到数据库之前,执行以下命令:
    java.lang.System.clearProperty('javax.xml.transform.TransformerFactory')
    
    这会将 java.xml.transform.TransformerFactory 恢复为默认的 Java 设置。 MATLAB 通常会覆盖此设置,这将使 third-party Java 类 与较旧的 Saxon Transformer 一起工作,但这与 ADAL4J 不兼容。因此,我们将其重置为默认值,以便 ADAL4J 可以再次使用默认的 Java XML Transformer。这必须在每个 MATLAB 会话中完成一次。
  6. 最后,您可以使用以下命令连接到您的数据库:
    conn = database('myDatabase','user@domain.com','myPassword',...
    'com.microsoft.sqlserver.jdbc.SQLServerDriver',...
    ['jdbc:sqlserver://myServer.database.windows.net:1433;' ...
     'encrypt=true;trustServerCertificate=false;' ...
     'hostNameInCertificate=*.database.windows.net;' ...
     'loginTimeout=30;authentication=ActiveDirectoryPassword;database='])
    
    您需要在哪里设置实际的数据库名称、用户名、密码和服务器地址。

就是这样,您现在应该可以连接到您的数据库了!