Spring Cloud Azure MySQL 支持

本文适用于: ✔️版本 4.14.0 ✔️ 版本 5.8.0

Azure Database for MySQL 是由 MySQL 社区版提供支持的关系数据库服务。 你可以在 Azure 中使用单一服务器或灵活服务器来托管 MySQL 数据库。 它是一种完全托管的数据库即服务产品,可以处理具有可预测性能和动态可伸缩性的任务关键型工作负荷。

从版本4.5.0开始,Spring Cloud Azure 支持各种类型的凭据,以便向 Azure Database for MySQL 灵活服务器进行身份验证。

支持的 MySQL 版本

初学者的当前版本应使用 Azure Database for MySQL 灵活服务器版本 5.78.0

核心功能

无密码连接

无密码连接使用 Microsoft Entra 身份验证连接到 Azure 服务,而无需在应用程序、配置文件或环境变量中存储任何凭据。 Microsoft Entra 身份验证是一种使用 Microsoft Entra ID 中定义的标识连接到 Azure Database for MySQL 的机制。 通过 Microsoft Entra 身份验证,可以在一个中心位置集中管理数据库用户标识和其他 Microsoft 服务,从而简化权限管理。

工作原理

Spring Cloud Azure 将首先根据应用程序身份验证配置生成以下类型的凭据之一:

  • ClientSecretCredential
  • ClientCertificateCredential
  • UsernamePasswordCredential
  • ManagedIdentityCredential
  • DefaultAzureCredential

如果未找到这些类型的凭据, DefaultAzureCredential 将从应用程序属性、环境变量、托管标识或 IDE 获取凭据。 有关详细信息,请参阅 Spring Cloud Azure 身份验证

以下高级关系图总结了如何将 OAuth 凭据身份验证与 Azure Database for MySQL 配合使用进行身份验证。 箭头表示通信路径。

Diagram showing Microsoft Entra authentication for MySQL.

配置

Spring Cloud Azure for MySQL 支持以下两个级别的配置选项:

  1. 全局身份验证配置选项 credentialprofile 前缀为 spring.cloud.azure.

  2. Spring Cloud Azure for MySQL 常见配置选项。

下表显示了 Spring Cloud Azure for MySQL 常见配置选项:

名称 描述
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 执行服务主体身份验证时要使用的客户端 ID。 这是一个旧属性。
spring.datasource.azure.credential.client-secret 使用 Azure 执行服务主体身份验证时要使用的客户端密码。 这是一个旧属性。
spring.datasource.azure.credential.managed-identity-enabled 是否允许托管标识通过 Azure 进行身份验证。 如果 为 trueclient-id 已设置,将使用客户端 ID 作为用户分配的托管标识客户端 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 资源的租户 ID。 允许 tenant-id 的值包括: commonorganizationsconsumers或租户 ID。

依赖项设置

将以下依赖项添加到项目。 这将自动在项目中以可传递方式包含 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 的身份验证创建和启用用户。 有关详细信息,请参阅 将 Spring Data JDBC 与 Azure Database for MySQL 配合使用。

在没有密码的情况下在本地连接到 Azure MySQL

  1. 若要创建用户和授予权限,请参阅“创建 MySQL 非管理员用户”,并授予将 Spring Data JDBC 与 Azure Database for MySQL 配合使用的权限部分。

  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 的值包括: commonorganizationsconsumers或租户 ID。 有关这些值的详细信息,请参阅 错误AADSTS50020的错误终结点(个人和组织帐户) 部分 - 来自标识提供者的用户帐户不存在于租户中。 有关转换单租户应用的信息,请参阅 Microsoft Entra ID 上的“将单租户应用转换为多租户”。

在 Azure Spring Apps 中使用托管标识连接到 Azure MySQL

  1. 若要启用托管标识,请参阅“使用迁移应用程序的Azure 门户部分分配托管标识,以使用 Azure Database for MySQL 的无密码连接。

  2. 若要授予权限,请参阅 “将角色分配到迁移应用程序的托管标识 ”部分 ,以使用 Azure Database for MySQL 的无密码连接。

  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 存储库。