Spring Cloud Azure MySQL 支援

本文說明如何利用 Spring Cloud Azure MySQL 支援,將 Spring Boot 應用程式連接到 適用於 MySQL 的 Azure 資料庫,並提供彈性的認證選項,包括無密碼的 Microsoft Entra 認證。

從版本 4.5.0,Spring Cloud Azure 支援各種類型的認證,以向適用於 MySQL 的 Azure 資料庫彈性伺服器進行驗證。

支援的 MySQL 版本

入門版的目前版本應該使用適用於 MySQL 的 Azure 資料庫彈性伺服器版本 5.7 或 8.0。

核心功能

無密碼連線

無密碼聯機會使用 Microsoft Entra 驗證來連線到 Azure 服務,而不需將任何認證儲存在應用程式、其組態檔或環境變數中。 Microsoft Entra 驗證是一種機制,可使用 Microsoft Entra 識別符中定義的身分識別連線到適用於 MySQL 的 Azure 資料庫。 透過使用 Microsoft Entra 認證,您可以集中管理資料庫使用者身份及其他 Microsoft 服務,簡化權限管理。

運作方式

Spring Cloud Azure 首先根據應用程式的認證設定,建立以下一種憑證類型:

  • ClientSecretCredential
  • ClientCertificateCredential
  • UsernamePasswordCredential
  • ManagedIdentityCredential
  • DefaultAzureCredential

如果應用程式找不到這些類型的憑證,它就會從應用程式屬性、環境變數、管理身份或 IDE 取得 DefaultAzureCredential 憑證。 如需詳細資訊,請參閱 Spring Cloud Azure 驗證。

以下高階圖彙總結了使用 OAuth 憑證認證與 適用於 MySQL 的 Azure 資料庫 進行驗證的運作方式。 箭號表示通訊路徑。

顯示 MySQL Microsoft Entra 驗證的圖表。

配置

Spring Cloud Azure for MySQL 支援下列兩個層級的組態選項:

  1. credential 和 profile 的全域驗證組態選項,前置詞為 spring.cloud.azure。

  2. 適用於 MySQL 的 Spring Cloud Azure 一般組態選項。

下表顯示適用於 MySQL 的 Spring Cloud Azure 一般組態選項:

名字 描述
spring.datasource.azure.passwordless-enabled 是否要使用 OAuth2 Microsoft Entra 令牌認證來啟用對 Azure 資料庫的無密碼連線。
spring.datasource.azure.credential.client-certificate-password 憑證檔案的密碼。
spring.datasource.azure.credential.client-certificate-path 使用 Azure 執行服務主體驗證時要使用的 PEM 憑證檔案路徑。
spring.datasource.azure.credential.client-id 使用 Azure 執行服務主體驗證時要使用的用戶端識別碼。 這是舊版屬性。
spring.datasource.azure.credential.client-secret 使用 Azure 執行服務主體驗證時要使用的客戶端密碼。 這是舊版屬性。
spring.datasource.azure.credential.managed-identity-enabled 是否要讓受控識別向 Azure 進行驗證。 如果已設定 true 和 client-id,則會使用用戶端標識碼作為使用者指派的受控識別用戶端標識符。 預設值為 false。
spring.datasource.azure.credential.password 使用 Azure 執行使用者名稱/密碼驗證時要使用的密碼。
spring.datasource.azure.credential.username 使用 Azure 執行使用者名稱/密碼驗證時要使用的用戶名稱。
spring.datasource.azure.profile.cloud-type 要連線的 Azure 雲端名稱。
spring.datasource.azure.profile.environment.active-directory-endpoint 要連線Microsoft Entra 端點。
spring.datasource.azure.profile.tenant-id Azure 資源的租用戶標識碼。 tenant-id 允許的值包括:common、organizations、consumers或租用戶標識碼。

相依性設定

將下列相依性新增至您的專案。 這個依賴性會自動包含在你的專案中。spring-boot-starter

<dependency>
    <groupId>com.azure.spring</groupId>
    <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>
</dependency>

注意

從版本 4.5.0開始支援無密碼連線。

記得把BOM spring-cloud-azure-dependencies 和前面的相依項目一起加進去。 如需詳細資訊,請參閱 Spring Cloud Azure 開發人員指南的 用戶入門 一節。

基本用法

下列各節顯示傳統 Spring Boot 應用程式使用案例。

重要

無密碼連線使用 Microsoft Entra 驗證。 要使用 Microsoft Entra 認證,請先設定 Microsoft Entra 管理員使用者。 只有Microsoft Entra 系統管理員使用者可以建立及啟用使用者,以Microsoft Entra ID 型驗證。 如需詳細資訊,請參閱 搭配適用於 MySQL 的 Azure 資料庫使用 Spring Data JDBC。

在本機連線至 Azure MySQL,而不需密碼

  1. 若要建立使用者並授與許可權,請參閱 建立 MySQL 非系統管理員使用者並授與許可權 一節 搭配適用於 MySQL 的 Azure 資料庫使用 Spring Data JDBC。

  2. 在您的 application.yml 檔案中設定下列屬性:

    spring:
      datasource:
        url: jdbc:mysql://${AZURE_MYSQL_SERVER_NAME}.mysql.database.azure.com:3306/${AZURE_MYSQL_DATABASE_NAME}
        username: ${AZURE_MYSQL_AD_NON_ADMIN_USERNAME}
        azure:
          passwordless-enabled: true
    

使用服務主體連線到 Azure MySQL

  1. 建立一個 Microsoft Entra 使用者來管理服務主體並授予權限。

    1. 使用下列命令來設定環境變數。

      export AZURE_MYSQL_AZURE_AD_SP_USERID=$(az ad sp list \
          --display-name <service_principal-name> \
          --query '[0].appId' 
          --output tsv)
      export AZURE_MYSQL_AZURE_AD_SP_USERNAME=<YOUR_MYSQL_AZURE_AD_USERNAME>
      export AZURE_MYSQL_SERVER_NAME=<YOUR_MYSQL_SERVER_NAME>
      export AZURE_MYSQL_DATABASE_NAME=<YOUR_MYSQL_DATABASE_NAME>
      export CURRENT_USERNAME=$(az ad signed-in-user show \
          --query userPrincipalName \
          --output tsv)
      
    2. 建立一個名為 create_ad_user_sp.sql 的 SQL 腳本,用來建立非管理員使用者。 請新增以下內容並儲存在本地:

      cat << EOF > create_ad_user_sp.sql
      SET aad_auth_validate_oids_in_tenant = OFF;
      CREATE AADUSER '$AZURE_MYSQL_AZURE_AD_SP_USERNAME' IDENTIFIED BY '$AZURE_MYSQL_AZURE_AD_SP_USERID';
      GRANT ALL PRIVILEGES ON $AZURE_MYSQL_DATABASE_NAME.* TO '$AZURE_MYSQL_AZURE_AD_SP_USERNAME'@'%';
      FLUSH privileges;
      EOF
      
    3. 使用下列命令來執行 SQL 腳本,以建立 Microsoft Entra 非系統管理員使用者:

      mysql -h $AZURE_MYSQL_SERVER_NAME.mysql.database.azure.com --user $CURRENT_USERNAME --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user_sp.sql
      
    4. 請使用以下指令移除暫存的 SQL 腳本檔案:

      rm create_ad_user_sp.sql
      
  2. 在您的 application.yml 檔案中設定下列屬性:

    spring:
      cloud:
        azure:
          credential:
            client-id: ${AZURE_CLIENT_ID}
            client-secret: ${AZURE_CLIENT_SECRET}
          profile:
            tenant-id: <tenant>
      datasource:
        url: jdbc:mysql://${AZURE_MYSQL_SERVER_NAME}.mysql.database.azure.com:3306/${AZURE_MYSQL_DATABASE_NAME}
        username: ${AZURE_MYSQL_AD_SP_USERNAME}
        azure:
          passwordless-enabled: true
    

注意

允許的tenant-id值為:common、、 organizationsconsumers、 或租戶 ID。 如需這些值的詳細資訊,請參閱 錯誤AADSTS50020 - 來自身分識別提供者的用戶帳戶不存在於租使用者的 使用錯誤的端點(個人和組織帳戶)一節。 如需轉換單一租使用者應用程式的資訊,請參閱 將單一租使用者應用程式轉換成多租使用者Microsoft Entra ID。

在 Azure Spring 應用程式 中使用受控識別連線到 Azure MySQL

  1. 若要啟用受控識別,請參閱 使用 Azure 入口網站指派受控識別 移轉應用程式以搭配適用於 MySQL 的 Azure 資料庫使用無密碼連線一節。

  2. 若要授與許可權,請參閱 將角色指派給受控識別 一節 移轉應用程式以使用與適用於 MySQL 的 Azure 資料庫的無密碼連線。

  3. 在您的 application.yml 檔案中設定下列屬性:

    spring:
      datasource:
        url: jdbc:mysql://${AZURE_MYSQL_SERVER_NAME}.mysql.database.azure.com:3306/${AZURE_MYSQL_DATABASE_NAME}
        username: ${AZURE_MYSQL_AD_MI_USERNAME}
        azure:
          passwordless-enabled: true
    

樣品

請參見 GitHub 上的 azure-spring-boot-samples 倉庫。