You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地Java代码通过Azure Active Directory集成身份验证连接Azure SQL数据库的实现方案及示例代码

本地Java代码通过Azure Active Directory集成身份验证连接Azure SQL数据库的实现方案及示例代码

嗨,我来帮你搞定这个问题!要让本地Java代码通过Azure AD集成身份验证连接Azure SQL数据库,咱们可以按下面的步骤操作,我还准备了完整的示例代码:

一、前置准备

  • 确认你的Azure SQL数据库已经开启Azure AD集成身份验证,并且你本地登录的Azure AD账号拥有该数据库的访问权限(比如被分配了db_datareader这类数据读取角色)
  • 本地安装Azure CLI,并且已经通过az login命令登录到你的Azure AD账号——这一步很关键,因为Java代码会借助Azure CLI缓存的凭据自动完成身份验证

二、依赖配置(Maven为例)

首先需要在你的项目中引入Azure SQL JDBC驱动和Azure身份验证相关的依赖,把下面的代码加到pom.xml里:

<dependencies>
    <!-- Azure SQL JDBC驱动 -->
    <dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>mssql-jdbc</artifactId>
        <version>12.4.1.jre8</version>
    </dependency>
    <!-- Azure Identity 库,用于获取AD令牌 -->
    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity</artifactId>
        <version>1.10.0</version>
    </dependency>
</dependencies>

三、完整Java示例代码

下面是可以直接运行的示例,你只需要替换成自己的数据库信息:

import com.azure.identity.DefaultAzureCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;

public class AzureSqlAadIntegratedAuthDemo {
    public static void main(String[] args) {
        // 替换为你的Azure SQL服务器和数据库名称
        String sqlServerName = "your-sql-server-name.database.windows.net";
        String databaseName = "your-database-name";
        // 构建JDBC连接URL
        String jdbcUrl = String.format(
            "jdbc:sqlserver://%s:1433;database=%s;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;",
            sqlServerName, databaseName
        );

        // 使用DefaultAzureCredential自动获取本地Azure CLI的登录凭据
        DefaultAzureCredential aadCredential = new DefaultAzureCredentialBuilder()
            .build();

        try {
            // 配置SQL Server数据源
            SQLServerDataSource dataSource = new SQLServerDataSource();
            dataSource.setURL(jdbcUrl);
            // 指定身份验证方式为Azure AD集成
            dataSource.setAuthentication("ActiveDirectoryIntegrated");
            // 获取Azure AD访问令牌并设置到数据源
            String accessToken = aadCredential.getToken("https://database.windows.net/.default")
                                              .block()
                                              .getToken();
            dataSource.setAccessToken(accessToken);

            // 建立连接、执行查询并处理结果
            try (Connection conn = dataSource.getConnection();
                 Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery("SELECT TOP 5 * FROM Your_Table_Name")) {

                // 遍历结果集(这里根据你的表结构调整列名或索引)
                while (rs.next()) {
                    System.out.printf("记录ID: %d,名称: %s%n", rs.getInt("id"), rs.getString("name"));
                }
            }
        } catch (Exception e) {
            System.err.println("连接或查询过程中出错:");
            e.printStackTrace();
        }
    }
}

四、关键要点说明

  • DefaultAzureCredential的优势:它会自动尝试多种身份验证途径,本地开发时优先用Azure CLI的缓存凭据,不用手动输入密码或配置复杂的证书,非常便捷
  • 权限验证:一定要确保你的Azure AD账号在Azure SQL数据库中被授予了合适的权限,你可以在Azure门户的数据库“权限”面板中添加用户并分配角色
  • 备选简化方式:如果你的本地环境支持Windows集成身份验证(比如Windows机器+Azure AD联合账号),也可以直接用简化的连接字符串,无需手动获取令牌:
    String simplifiedJdbcUrl = "jdbc:sqlserver://your-server.database.windows.net:1433;database=your-db;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;authentication=ActiveDirectoryIntegrated;";
    Connection conn = DriverManager.getConnection(simplifiedJdbcUrl);
    
    不过这种方式依赖Kerberos配置,稳定性不如用Azure Identity库的方案,更推荐前者。

备注:内容来源于stack exchange,提问作者satheetha saleem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 12:03:03