本地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联合账号),也可以直接用简化的连接字符串,无需手动获取令牌:
不过这种方式依赖Kerberos配置,稳定性不如用Azure Identity库的方案,更推荐前者。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);
备注:内容来源于stack exchange,提问作者satheetha saleem
相关产品推荐
相关产品推荐

