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

如何在Azure Pipelines中通过JDBC实现基于服务主体的无密码认证?

Azure Pipelines中Flyway使用服务主体通过ADAL4J认证Azure SQL失败

环境信息

  • CI/CD:Azure Pipelines
  • 操作系统:Ubuntu(最新版)
  • Java:OpenJDK 11
  • 数据库:Azure SQL
  • 数据库迁移工具:Flyway(v6.0.1)

问题描述

希望在Azure环境中用服务主体替代密码进行身份验证,在Azure Pipelines运行Flyway数据库迁移脚本时,尝试通过ADAL4J实现ActiveDirectoryIntegrated身份验证,但始终加载失败。

简化后的Pipeline脚本

variables:
  FLYWAY_VERSION: '6.0.1'

pool:
  vmImage: "ubuntu-latest"

steps:
  - task: AzureCLI@2
    inputs:
      azureSubscription: 'MyServicePrincipalSubscription'
      scriptType: 'bash'
      scriptLocation: 'inlineScript'
      inlineScript: |

        # Install Flyway
        curl -L https://repo1.maven.org/maven2/org/flywaydb/flyway-commandline/$(FLYWAY_VERSION)/flyway-commandline-$(FLYWAY_VERSION)-linux-x64.tar.gz -o flyway.tar.gz
        tar -xzf flyway.tar.gz

        # Run migrations
        ./flyway-$(FLYWAY_VERSION)/flyway \
          -locations="filesystem:./DataChanges/test" \
          -url="jdbc:sqlserver://***;Authentication=ActiveDirectoryIntegrated" \
          migrate -X

执行错误信息

SQL State  : null
Error Code : 0
Message    : Failed to load both sqljdbc_auth.dll and ADAL4J Java library for performing ActiveDirectoryIntegrated authentication. Please install one of them to proceed.

已尝试的解决方案

  1. 手动添加ADAL4J到Flyway的JARS目录:
curl -L https://repo1.maven.org/maven2/com/microsoft/azure/adal4j/1.6.6/adal4j-1.6.6.jar -o adal4j.jar

mv adal4j.jar flyway-$(FLYWAY_VERSION)/jars/

DEBUG: Adding location to classpath: /home/vsts/work/1/s/flyway-6.0.1/jars/adal4j.jar <-- Confirmation of loading. 
  1. 切换到Windows虚拟机并使用PowerShell:
pool:
  vmImage: "windows-latest"

steps:
  - task: AzureCLI@2
    inputs:
      azureSubscription: 'MyServicePrincipalSubscription'
      scriptType: 'ps'

解决方法

方案1:补充ADAL4J的完整依赖包

ADAL4J本身依赖多个第三方库,仅添加adal4j.jar无法满足运行要求,需要下载所有关联依赖放到Flyway的jars目录:

# 创建临时目录存放依赖
mkdir temp-jars
cd temp-jars

# 批量下载必要依赖
curl -O https://repo1.maven.org/maven2/com/microsoft/azure/adal4j/1.6.6/adal4j-1.6.6.jar
curl -O https://repo1.maven.org/maven2/javax/activation/activation/1.1.1/activation-1.1.1.jar
curl -O https://repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.jar
curl -O https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar
curl -O https://repo1.maven.org/maven2/com/google/guava/guava/25.1-jre/guava-25.1-jre.jar
curl -O https://repo1.maven.org/maven2/com/sun/mail/javax.mail/1.5.6/javax.mail-1.5.6.jar
curl -O https://repo1.maven.org/maven2/net/minidev/json-smart/2.3/json-smart-2.3.jar
curl -O https://repo1.maven.org/maven2/com/nimbusds/nimbus-jose-jwt/8.19/nimbus-jose-jwt-8.19.jar
curl -O https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar

# 移动到Flyway jars目录
mv *.jar ../flyway-$(FLYWAY_VERSION)/jars/
cd ..
rm -rf temp-jars

方案2:改用ActiveDirectoryServicePrincipal认证模式

直接使用服务主体专属的认证模式,无需依赖ADAL4J,利用Azure Pipeline中已有的服务主体凭据:

# 从AzureCLI上下文提取服务主体信息
SP_ID=$(az account show --query user.name -o tsv)
SP_SECRET=$(az account get-access-token --query accessToken -o tsv)
TENANT_ID=$(az account show --query tenantId -o tsv)

# 执行Flyway迁移
./flyway-$(FLYWAY_VERSION)/flyway \
  -locations="filesystem:./DataChanges/test" \
  -url="jdbc:sqlserver://***;Authentication=ActiveDirectoryServicePrincipal;databaseName=你的数据库名" \
  -user="$SP_ID" \
  -password="$SP_SECRET" \
  migrate -X

方案3:升级Flyway版本

Flyway 6.0.1版本较陈旧,后续v7及以上版本对Azure SQL的AD认证支持更完善,内置了必要的依赖库,升级后可直接使用ActiveDirectoryIntegrated模式,无需手动添加jar包。


内容的提问来源于stack exchange,提问作者Atli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 11:36:16