如何使用 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 容器