Suporte ao MySQL do Azure do Spring Cloud

Este artigo explica como usar o suporte do Spring Cloud Azure MySQL para conectar aplicativos Spring Boot a Banco de Dados do Azure para MySQL com opções de autenticação flexíveis, incluindo autenticação de Microsoft Entra sem senha.

Na versão 4.5.0, o Spring Cloud Azure dá suporte a vários tipos de credenciais para autenticação no servidor flexível do Banco de Dados do Azure para MySQL.

Versão do MySQL com suporte

A versão atual do início deve usar a versão do Servidor Flexível do Banco de Dados do Azure para MySQL 5.7 ou 8.0.

Principais recursos

Conexão sem senha

A conexão sem senha usa a autenticação do Microsoft Entra para se conectar aos serviços do Azure sem armazenar credenciais no aplicativo, seus arquivos de configuração ou em variáveis de ambiente. A autenticação do Microsoft Entra é um mecanismo para se conectar ao Banco de Dados do Azure para MySQL usando identidades definidas na ID do Microsoft Entra. Usando Microsoft Entra autenticação, você pode gerenciar identidades de usuário de banco de dados e outras serviços Microsoft em um local central, o que simplifica o gerenciamento de permissões.

Como funciona

O Spring Cloud Azure primeiro cria um dos seguintes tipos de credenciais, dependendo da configuração de autenticação do aplicativo:

  • ClientSecretCredential
  • ClientCertificateCredential
  • UsernamePasswordCredential
  • ManagedIdentityCredential
  • DefaultAzureCredential

Se o aplicativo não encontrar nenhum desses tipos de credenciais, ele obterá DefaultAzureCredential credenciais de propriedades do aplicativo, variáveis de ambiente, identidades gerenciadas ou o IDE. Para obter mais informações, consulte de autenticação do Spring Cloud Azure.

O diagrama de alto nível a seguir resume como a autenticação funciona usando a autenticação de credencial OAuth com Banco de Dados do Azure para MySQL. As setas indicam caminhos de comunicação.

Diagrama mostrando a autenticação do Microsoft Entra para MySQL.

Configuração

O Spring Cloud Azure para MySQL dá suporte aos dois níveis de opções de configuração a seguir:

  1. As opções de configuração de autenticação global de credential e profile com prefixos de spring.cloud.azure.

  2. Opções de configuração comuns do Spring Cloud Azure para MySQL.

A tabela a seguir mostra as opções de configuração comuns do Azure para MySQL do Spring Cloud:

Nome Descrição
spring.datasource.azure.passwordless-enabled Se deseja habilitar conexões sem senha para bancos de dados do Azure usando as credenciais de token do Microsoft Entra OAuth2.
spring.datasource.azure.credential.client-certificate-password Senha do arquivo de certificado.
spring.datasource.azure.credential.client-certificate-path Caminho de um arquivo de certificado PEM a ser usado ao executar a autenticação da entidade de serviço com o Azure.
spring.datasource.azure.credential.client-id ID do cliente a ser usada ao executar a autenticação da entidade de serviço com o Azure. Esta é uma propriedade herdada.
spring.datasource.azure.credential.client-secret Segredo do cliente a ser usado ao executar a autenticação da entidade de serviço com o Azure. Esta é uma propriedade herdada.
spring.datasource.azure.credential.managed-identity-enabled Se deseja habilitar a identidade gerenciada para autenticar com o Azure. Se true e o client-id estiver definido, usará a ID do cliente como ID do cliente de identidade gerenciada atribuída pelo usuário. O valor padrão é false.
spring.datasource.azure.credential.password Senha a ser usada ao executar a autenticação de nome de usuário/senha com o Azure.
spring.datasource.azure.credential.username Nome de usuário a ser usado ao executar a autenticação de nome de usuário/senha com o Azure.
spring.datasource.azure.profile.cloud-type Nome da nuvem do Azure à qual se conectar.
spring.datasource.azure.profile.environment.active-directory-endpoint O ponto de extremidade do Microsoft Entra ao qual se conectar.
spring.datasource.azure.profile.tenant-id ID do locatário para recursos do Azure. Os valores permitidos para tenant-id são: common, organizations, consumersou a ID do locatário.

Configuração de dependência

Adicione a dependência a seguir ao seu projeto. Essa dependência inclui automaticamente a spring-boot-starter dependência em seu projeto.

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

Nota

Há suporte para conexões sem senha começando com a versão 4.5.0.

Lembre-se de adicionar o BOM spring-cloud-azure-dependencies junto com a dependência anterior. Para obter mais informações, consulte a seção Introdução do guia do desenvolvedor do Spring Cloud Azure.

Uso básico

As seções a seguir mostram os cenários clássicos de uso do aplicativo Spring Boot.

Importante

A conexão sem senha usa a autenticação do Microsoft Entra. Para usar Microsoft Entra autenticação, defina o usuário administrador do Microsoft Entra primeiro. Somente um usuário administrador do Microsoft Entra pode criar e habilitar usuários para autenticação baseada em ID do Microsoft Entra. Para obter mais informações, consulte Usar o JDBC do Spring Data com o Banco de Dados do Azure para MySQL.

Conectar-se ao MySQL do Azure localmente sem senha

  1. Para criar usuários e conceder permissão, consulte o Criar um usuário não administrador do MySQL e conceder permissão seção de Usar o Spring Data JDBC com o Banco de Dados do Azure para MySQL.

  2. Configure as seguintes propriedades em seu arquivo de 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
    

Conectar-se ao MySQL do Azure usando uma entidade de serviço

  1. Crie um usuário Microsoft Entra para a entidade de serviço e conceda permissão.

    1. Use os comandos a seguir para configurar variáveis de ambiente.

      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. Crie um script SQL chamado create_ad_user_sp.sql para criar um usuário não administrador. Adicione o seguinte conteúdo e salve-o localmente:

      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. Use o seguinte comando para executar o script SQL para criar o usuário não administrador do 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. Use o seguinte comando para remover o arquivo de script SQL temporário:

      rm create_ad_user_sp.sql
      
  2. Configure as seguintes propriedades em seu arquivo de 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
    

Nota

Os valores permitidos sãotenant-id: common, , organizationsconsumersou a ID do locatário. Para obter mais informações sobre esses valores, consulte a seção Usado no ponto de extremidade incorreto (contas pessoais e de organização) da Error AADSTS50020 – A conta de usuário do provedor de identidade não existe node locatário. Para obter informações sobre como converter seu aplicativo de locatário único, consulte Converter aplicativo de locatário único em multilocatário no Microsoft Entra ID.

Conectar-se ao MySQL do Azure com a Identidade Gerenciada no Aplicativos Spring do Azure

  1. Para habilitar a identidade gerenciada, consulte o Atribuir a identidade gerenciada usando o portal do Azure seção Migrar um aplicativo para usar conexões sem senha com o Banco de Dados do Azure para MySQL.

  2. Para conceder permissões, consulte a seção Atribuir funções à identidade gerenciada seção do Migrar um aplicativo para usar conexões sem senha com o Banco de Dados do Azure para MySQL.

  3. Configure as seguintes propriedades em seu arquivo de 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
    

Amostras

Consulte o azure-spring-boot-samples repositório no GitHub.