通过JDBC连接MSSQL Server时能否使用Azure Active Directory身份验证
JDBC通过Azure Active Directory连接SQL Server解决方案
可以通过Azure Active Directory实现JDBC连接SQL Server,微软官方的SQL Server JDBC驱动从6.0版本开始就原生支持多种Azure AD认证模式。
你提供的Windows认证代码只需修改少量参数即可适配Azure AD认证场景,以下是两种常用场景的示例代码:
1. Azure AD用户名密码认证(改动最小,适合测试场景)
val jdbcHostname = "hostname" val jdbcPort = 1433 val jdbcDatabase = "database_name" // 仅修改jdbcUrl的认证参数即可 val jdbcUrl = s"jdbc:sqlserver://${jdbcHostname}:${jdbcPort};database=${jdbcDatabase};authentication=ActiveDirectoryPassword" // 用户名密码替换为Azure AD账号密码,格式通常为xxx@your_domain.onmicrosoft.com val username = "azure_ad_username" val password = "azure_ad_password" val driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver" // 读取为Spark DataFrame的逻辑无需调整 val jdbcDF = spark.read .format("jdbc") .option("url", jdbcUrl) .option("dbtable", table) .option("user", username) .option("password", password) .option("driver", driver) .load()
2. Azure AD服务主体令牌认证(更安全,适合生产自动化场景)
不需要硬编码账号密码,先通过Azure AD接口获取访问令牌后传入配置即可:
// 提前获取Azure AD访问令牌的逻辑省略,示例中令牌存储在变量aadAccessToken中 val jdbcHostname = "hostname" val jdbcPort = 1433 val jdbcDatabase = "database_name" val jdbcUrl = s"jdbc:sqlserver://${jdbcHostname}:${jdbcPort};database=${jdbcDatabase}" val driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver" val jdbcDF = spark.read .format("jdbc") .option("url", jdbcUrl) .option("dbtable", table) .option("accessToken", aadAccessToken) .option("driver", driver) .load()
注意事项
- 必须使用6.0及以上版本的
mssql-jdbc驱动,部分高版本驱动需要同步依赖对应版本的Azure AD认证相关依赖包 - 所用的Azure AD身份(普通用户/服务主体)需要提前在目标SQL库中创建映射用户并授权,参考SQL语句:
CREATE USER [aad_identity_name] FROM EXTERNAL PROVIDER; - 如果连接的是非Azure托管的本地SQL Server,需要先完成本地SQL Server实例的Azure AD认证配置,否则该方式不生效
内容的提问来源于stack exchange,提问作者Muhammad_Pathn
相关产品推荐
相关产品推荐

