如何使用 Scala 中的服务主体连接到 Azure SQL Server

Posted

技术标签:

【中文标题】如何使用 Scala 中的服务主体连接到 Azure SQL Server【英文标题】:How to connect to an Azure SQL Server using service principal in Scala 【发布时间】:2021-10-12 10:04:59 【问题描述】:

我正在寻找一种使用服务主体与 SCALA 连接到 Azure 数据库的方法。

我希望能够生成一个令牌并在 JDBC 中使用它来连接数据库。 Python 示例:

import adal

# Located in App Registrations from Azure Portal
tenant_id = "<< tenant id >> "

# Located in App Registrations from Azure Portal
resource_app_id_url = "https://database.windows.net/"

# Authority
authority = "https://login.windows.net/" + tenant_id

context = adal.AuthenticationContext(authority)
token = context.acquire_token_with_client_credentials(resource_app_id_url, service_principal_id, service_principal_secret)
access_token = token["accessToken"]

jdbc_df = spark.read \
        .format("com.microsoft.sqlserver.jdbc.spark") \
        .option("url", url) \
        .option("dbtable", dbtable) \
        .option("accessToken", access_token) \
        .option("encrypt", "true") \
        .option("hostNameInCertificate", "*.database.windows.net") \
        .load()

Another SO Example.

谢谢

【问题讨论】:

【参考方案1】:

经过几天的搜索,这就是答案!

import com.microsoft.aad.adal4j.AuthenticationContext;
import com.microsoft.aad.adal4j.ClientCredential;
import java.util.concurrent.Executors;


val AUTHORITY_URL = "https://login.microsoftonline.com/"+tenant_id
val principalId = service_principal_id
val principalSecret = service_principal_secret
val URL="jdbc:sqlserver://xx.database.windows.net:1433;database=xx;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30"



val service = Executors.newFixedThreadPool(1);
val context = new AuthenticationContext(AUTHORITY_URL, true, service);
val credential = new ClientCredential(principalId, principalSecret);
val result = context.acquireToken("https://database.windows.net/", credential, null).get();

// println("***********************")
// println(result.getAccessToken())
// println("***********************")


val df= spark.read 
        .format("com.microsoft.sqlserver.jdbc.spark") 
        .option("url", URL) 
        .option("dbtable", "xx") 
        .option("accessToken", result.getAccessToken()) 
        .load()

【讨论】:

以上是关于如何使用 Scala 中的服务主体连接到 Azure SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

OkHttp Websockets - 连接到 websocket 时添加一个主体

为啥我们在启用 Kerberos 的 EMR 集群上使用直线连接到 Hive 时使用 Hive 服务主体?

无法连接到 Scala 测试中的 Cassandra docker 容器

如何连接到远程 Redis 服务器?

如何使用 Scala Eclipse IDE 连接到现有的 Hive

如何从 QlikView 连接到 Databricks Delta 表?