Tutorial: Conectar-se a um banco de dados MySQL a partir do Java JBoss EAP App Service com conexão sem senha
O Serviço de Aplicativo do Azure fornece um serviço de hospedagem na Web altamente escalável e auto-corrigido no Azure. Ele também fornece uma identidade gerenciada para seu aplicativo, que é uma solução turn-key para proteger o acesso ao Banco de Dados do Azure para MySQL e outros serviços do Azure. As identidades gerenciadas no Serviço de Aplicativo tornam seu aplicativo mais seguro, eliminando segredos de seu aplicativo, como credenciais nas variáveis de ambiente.
Neste tutorial, irá aprender a:
- Crie um banco de dados MySQL.
- Implante um aplicativo JBoss EAP de exemplo no Serviço de Aplicativo do Azure usando um pacote WAR.
- Configure um aplicativo Web Spring Boot para usar a autenticação Microsoft Entra com o Banco de Dados MySQL.
- Conecte-se ao banco de dados MySQL com identidade gerenciada usando o Service Connector.
Se não tiver uma subscrição do Azure, crie uma conta gratuita do Azure antes de começar.
Pré-requisitos
- Git
- Java JDK
- Maven
- Azure CLI versão 2.46.0 ou superior.
- Azure CLI serviceconnector-passwordless extension version 0.2.2 ou superior.
- JQ
Clone o aplicativo de exemplo e prepare o repositório
Execute os seguintes comandos em seu terminal para clonar o repositório de exemplo e configurar o ambiente do aplicativo de exemplo.
git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
cd Passwordless-Connections-for-Java-Apps/JakartaEE/jboss-eap/
Criar uma Base de dados do Azure para MySQL
Siga estas etapas para criar um recurso do Banco de Dados do Azure para MySQL em sua assinatura. O aplicativo Spring Boot se conecta a esse banco de dados e armazena seus dados durante a execução, persistindo o estado do aplicativo, não importa onde você execute o aplicativo.
Entre na CLI do Azure e, opcionalmente, defina sua assinatura se tiver mais de uma conectada às suas credenciais de logon.
az login az account set --subscription <subscription-ID>
Criar um grupo de recursos do Azure.
export RESOURCE_GROUP=<resource-group-name> export LOCATION=eastus az group create --name $RESOURCE_GROUP --location $LOCATION
Crie um Banco de Dados do Azure para o servidor MySQL. O servidor é criado com uma conta de administrador, mas não é usado porque vamos usar a conta de administrador do Microsoft Entra para executar tarefas administrativas.
export MYSQL_ADMIN_USER=azureuser # MySQL admin access rights won't be used because Azure AD authentication is leveraged to administer the database. export MYSQL_ADMIN_PASSWORD=<admin-password> export MYSQL_HOST=<mysql-host-name> # Create a MySQL server. az mysql flexible-server create \ --name $MYSQL_HOST \ --resource-group $RESOURCE_GROUP \ --location $LOCATION \ --admin-user $MYSQL_ADMIN_USER \ --admin-password $MYSQL_ADMIN_PASSWORD \ --public-access 0.0.0.0 \ --tier Burstable \ --sku-name Standard_B1ms \ --storage-size 32
Crie um banco de dados para o aplicativo.
export DATABASE_NAME=checklist az mysql flexible-server db create \ --resource-group $RESOURCE_GROUP \ --server-name $MYSQL_HOST \ --database-name $DATABASE_NAME
Criar um Serviço de Aplicações
Crie um recurso do Serviço de Aplicativo do Azure no Linux. JBoss EAP requer Premium SKU.
export APPSERVICE_PLAN=<app-service-plan>
export APPSERVICE_NAME=<app-service-name>
# Create an App Service plan
az appservice plan create \
--resource-group $RESOURCE_GROUP \
--name $APPSERVICE_PLAN \
--location $LOCATION \
--sku P1V3 \
--is-linux
# Create an App Service resource.
az webapp create \
--resource-group $RESOURCE_GROUP \
--name $APPSERVICE_NAME \
--plan $APPSERVICE_PLAN \
--runtime "JBOSSEAP:7-java8"
Conecte o banco de dados MySQL com conectividade de identidade
Em seguida, conecte o banco de dados usando o Service Connector.
Instale a extensão sem senha do Service Connector para a CLI do Azure:
az extension add --name serviceconnector-passwordless --upgrade
Crie uma identidade gerenciada atribuída pelo usuário para a autenticação do Microsoft Entra usando o comando a seguir. Para obter mais informações, consulte Configurar a autenticação do Microsoft Entra para o Banco de Dados do Azure para MySQL - Servidor Flexível.
export USER_IDENTITY_NAME=<your-user-assigned-managed-identity-name> export IDENTITY_RESOURCE_ID=$(az identity create \ --name $USER_IDENTITY_NAME \ --resource-group $RESOURCE_GROUP \ --query id \ --output tsv)
Peça ao seu Administrador Global ou Administrador de Função Privilegiada para conceder as seguintes permissões à nova identidade atribuída pelo usuário:
User.Read.All
,GroupMember.Read.All
eApplication.Read.ALL
. Para obter mais informações, consulte a seção Permissões da autenticação do Ative Directory.Conecte seu aplicativo a um banco de dados MySQL com uma identidade gerenciada atribuída pelo sistema usando o Service Connector. Para fazer essa conexão, execute o comando az webapp connection create .
az webapp connection create mysql-flexible \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_NAME \ --target-resource-group $RESOURCE_GROUP \ --server $MYSQL_HOST \ --database $DATABASE_NAME \ --system-identity mysql-identity-id=$IDENTITY_RESOURCE_ID \ --client-type java
Este comando do Service Connector executa as seguintes tarefas em segundo plano:
Habilite a identidade gerenciada atribuída ao sistema para o aplicativo
$APPSERVICE_NAME
hospedado pelo Serviço de Aplicativo do Azure.Defina o administrador do Microsoft Entra como o usuário conectado atual.
Adicione um usuário de banco de dados para a identidade gerenciada atribuída ao sistema na etapa 1 e conceda todos os privilégios do banco de dados
$DATABASE_NAME
a esse usuário. Você pode obter o nome de usuário da cadeia de conexão na saída do comando anterior.Adicione uma cadeia de conexão às Configurações do aplicativo no aplicativo chamado
AZURE_MYSQL_CONNECTIONSTRING
.Nota
Se vir a mensagem
The subscription is not registered to use Microsoft.ServiceLinker
de erro , execute o comandoaz provider register --namespace Microsoft.ServiceLinker
para registar o fornecedor de recursos do Service Connector e, em seguida, execute novamente o comando de ligação.
Implementar a aplicação
Siga estas etapas para preparar dados em um banco de dados e implantar o aplicativo.
Criar esquema de banco de dados
Abra um firewall para permitir a conexão do seu endereço IP atual.
# Create a temporary firewall rule to allow connections from your current machine to the MySQL server export MY_IP=$(curl http://whatismyip.akamai.com) az mysql flexible-server firewall-rule create \ --resource-group $RESOURCE_GROUP \ --name $MYSQL_HOST \ --rule-name AllowCurrentMachineToConnect \ --start-ip-address ${MY_IP} \ --end-ip-address ${MY_IP}
Conecte-se ao banco de dados e crie tabelas.
export DATABASE_FQDN=${MYSQL_HOST}.mysql.database.azure.com export CURRENT_USER=$(az account show --query user.name --output tsv) export RDBMS_ACCESS_TOKEN=$(az account get-access-token \ --resource-type oss-rdbms \ --output tsv \ --query accessToken) mysql -h "${DATABASE_FQDN}" --user "${CURRENT_USER}" --enable-cleartext-plugin --password="$RDBMS_ACCESS_TOKEN" < azure/init-db.sql
Remova a regra de firewall temporária.
az mysql flexible-server firewall-rule delete \ --resource-group $RESOURCE_GROUP \ --name $MYSQL_HOST \ --rule-name AllowCurrentMachineToConnect
Implementar a aplicação
Atualize a cadeia de conexão nas Configurações do aplicativo.
Obtenha a cadeia de conexão gerada pelo Service Connector e adicione o plug-in de autenticação sem senha. Essa cadeia de conexão é referenciada no script de inicialização.
export PASSWORDLESS_URL=$(\ az webapp config appsettings list \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_NAME \ | jq -c '.[] \ | select ( .name == "AZURE_MYSQL_CONNECTIONSTRING" ) \ | .value' \ | sed 's/"//g') # Create a new environment variable with the connection string including the passwordless authentication plugin export PASSWORDLESS_URL=${PASSWORDLESS_URL}'&defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin' az webapp config appsettings set \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_NAME \ --settings "AZURE_MYSQL_CONNECTIONSTRING_PASSWORDLESS=${PASSWORDLESS_URL}"
O aplicativo de exemplo contém um arquivo pom.xml que pode gerar o arquivo WAR. Execute o seguinte comando para criar o aplicativo.
mvn clean package -DskipTests
Implante o WAR e o script de inicialização no serviço do aplicativo.
az webapp deploy \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_NAME \ --src-path target/ROOT.war \ --type war az webapp deploy \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_NAME \ --src-path src/main/webapp/WEB-INF/createMySQLDataSource.sh \ --type startup
Aplicativo Web de exemplo de teste
Execute o seguinte comando para testar o aplicativo.
export WEBAPP_URL=$(az webapp show \
--resource-group $RESOURCE_GROUP \
--name $APPSERVICE_NAME \
--query defaultHostName \
--output tsv)
# Create a list
curl -X POST -H "Content-Type: application/json" -d '{"name": "list1","date": "2022-03-21T00:00:00","description": "Sample checklist"}' https://${WEBAPP_URL}/checklist
# Create few items on the list 1
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 1"}' https://${WEBAPP_URL}/checklist/1/item
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 2"}' https://${WEBAPP_URL}/checklist/1/item
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 3"}' https://${WEBAPP_URL}/checklist/1/item
# Get all lists
curl https://${WEBAPP_URL}/checklist
# Get list 1
curl https://${WEBAPP_URL}/checklist/1
Clean up resources (Limpar recursos)
Nos passos anteriores, criou os recursos do Azure num grupo de recursos. Se achar que não vai precisar destes recursos no futuro, execute o seguinte comando no Cloud Shell para eliminar o grupo de recursos:
az group delete --name myResourceGroup
Este comando pode demorar alguns minutos a ser executado.
Próximo passo
Saiba mais sobre como executar aplicativos Java no Serviço de Aplicativo no Linux no guia do desenvolvedor.