Suporte ao Spring Cloud Azure MySQL

Este artigo explica como usar o suporte Spring Cloud Azure MySQL para ligar aplicações Spring Boot ao Base de Dados do Azure para MySQL com opções de autenticação flexíveis, incluindo autenticação Microsoft Entra sem palavra-passe.

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

Versão MySQL suportada

A versão atual do starter deve usar o Banco de Dados do Azure para MySQL Flexible Server versão 5.7 ou 8.0.

Principais características

Ligação sem palavra-passe

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, em 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. Ao utilizar a autenticação Microsoft Entra, pode gerir as identidades dos utilizadores da base de dados e outros serviços serviços Microsoft numa localização central, o que simplifica a gestão de permissões.

Como funciona

O Spring Cloud Azure constrói primeiro um dos seguintes tipos de credenciais, dependendo da configuração de autenticação da aplicação:

  • ClientSecretCredential
  • ClientCertificateCredential
  • UsernamePasswordCredential
  • ManagedIdentityCredential
  • DefaultAzureCredential

Se a aplicação não encontrar nenhum destes tipos de credenciais, obtém-nas DefaultAzureCredential através das propriedades da aplicação, variáveis de ambiente, identidades geridas ou do IDE. Para obter mais informações, consulte de autenticação do Spring Cloud Azure .

O seguinte diagrama de alto nível resume como funciona a autenticação através da autenticação de credenciais OAuth com o Base de Dados do Azure para MySQL. As setas indicam vias de comunicação.

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

Configuração

O Spring Cloud Azure para MySQL suporta os seguintes dois níveis de opções de configuração:

  1. As opções de configuração de autenticação global do 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 Spring Cloud Azure para MySQL:

Designação Descrição
spring.datasource.azure.passwordless-enabled Se é necessário habilitar conexões sem senha para bancos de dados do Azure usando credenciais de token OAuth2 Microsoft Entra.
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 legada.
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 legada.
spring.datasource.azure.credential.managed-identity-enabled Se a identidade gerenciada deve ser habilitada para autenticação com o Azure. Se true e o client-id estiver definido, usará o ID do cliente como ID do cliente de identidade gerenciada atribuído ao 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 o ID do locatário.

Configuração de dependência

Adicione a seguinte dependência ao seu projeto. Esta dependência inclui automaticamente a spring-boot-starter dependência no seu projeto.

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

Observação

As ligações sem palavra-passe são suportadas a partir da versão 4.5.0.

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

Utilização básica

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 a autenticação Microsoft Entra, defina primeiro o utilizador administrador do Microsoft Entra. 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 Spring Data JDBC com o Banco de Dados do Azure para MySQL.

Conectar-se ao Azure MySQL localmente sem senha

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

  2. Configure as seguintes propriedades no arquivo 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 Azure MySQL usando uma entidade de serviço

  1. Crie um utilizador Microsoft Entra para o principal do 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. Cria um script SQL chamado create_ad_user_sp.sql para criar um utilizador não administrativo. Adicione o seguinte conteúdo e guarde-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 ficheiro temporário de script SQL:

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

Observação

Os valores permitidos para tenant-id são: common, organizations, consumers, ou o ID do inquilino. Para obter mais informações sobre esses valores, consulte a seção Usado o ponto de extremidade errado (contas pessoais e de organização) de AADSTS50020 de erro - A conta de usuário do provedor de identidade não existe nodo 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 Azure MySQL com identidade gerenciada no Azure Spring Apps

  1. Para habilitar a identidade gerenciada, consulte a seção Atribuir a identidade gerenciada usando o portal do Azure de 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 ao de identidade gerenciado de Migrar um aplicativo para usar conexões sem senha com o Banco de Dados do Azure para MySQL.

  3. Configure as seguintes propriedades no arquivo 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

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