Partager via


Tutoriel : Se connecter à une base de données MySQL à partir de Java JBoss EAP App Service avec une connexion sans mot de passe

Azure App Service offre un service d'hébergement web hautement évolutif appliquant des mises à jour correctives automatiques dans Azure. Il offre également une identité managée pour votre application, qui constitue une solution clé en main permettant de sécuriser l’accès à Azure Database pour MySQL et à d’autres services Azure. Les identités managées dans App Service sécurisent votre application en en éliminant les secrets, par exemple les informations d’identification dans les variables d’environnement. Dans ce tutoriel, vous allez apprendre à :

  • Créer une base de données MySQL.
  • Déployez un exemple d’application JBoss EAP pour Azure App Service à l’aide d’un package WAR.
  • Configurer une application web Spring Boot pour utiliser l’authentification Microsoft Entra avec une base de données MySQL.
  • Se connecter à une base de données MySQL avec une identité managée à l’aide d’un connecteur de services.

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit Azure avant de commencer.

Prérequis

Cloner l’exemple d’application de liste de tâches et préparer le référentiel

Exécutez les commandes suivantes dans votre terminal pour cloner l’exemple de dépôt et configurer l’exemple d’environnement d’application.

git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
cd Passwordless-Connections-for-Java-Apps/JakartaEE/jboss-eap/

Créer une base de données Azure pour MySQL

Suivez ces étapes pour créer un serveur Azure Database pour MySQL dans votre abonnement. L’application Spring Boot se connecte à cette base de données et stocke ses données lors de l’exécution, entraînant la persistance de l’état de l’application, quel que soit l’endroit d’où vous l’exécutez.

  1. Connectez-vous à Azure CLI et définissez votre abonnement si vous en avez plusieurs connectés à vos informations d’identification.

    az login
    az account set --subscription <subscription-ID>
    
  2. Créez un groupe de ressources Azure, en notant son nom.

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=eastus
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Créez un serveur Azure Database pour MySQL. Le serveur est créé avec un compte administrateur, mais il n’est pas utilisé, car nous utilisons le compte administrateur Microsoft Entra pour effectuer les tâches administratives.

    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
    
  4. Créez une base de données pour l’application.

    export DATABASE_NAME=checklist
    
    az mysql flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $MYSQL_HOST \
        --database-name $DATABASE_NAME
    

Créer une instance App Service

Créez une ressource Azure App Service sur Linux. JBoss EAP nécessite une référence SKU Premium.

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"

Connecter la base de données MySQL avec une connectivité d’identité

Ensuite, connectez la base de données en utilisant Service Connector.

Installez l’extension sans mot de passe Service Connector pour Azure CLI :

az extension add --name serviceconnector-passwordless --upgrade

Ensuite, utilisez la commande suivante pour créer une identité managée affectée par l’utilisateur pour l’authentification Microsoft Entra. Pour plus d’informations, consultez Configurer l’authentification Microsoft Entra pour Azure Database pour MySQL : Serveur flexible.

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)

Important

Après avoir créé l’identité affectée par l’utilisateur, demandez à votre Administrateur général ou Administrateur de rôle privilégié d’accorder les autorisations suivantes pour cette identité : User.Read.All, GroupMember.Read.All et Application.Read.ALL. Pour plus d’informations, consultez la section Autorisations d’Authentification Active Directory.

Ensuite, connectez votre application à une base de données MySQL avec une identité managée affectée par le système à l’aide de Service Connector. Pour effectuer cette connexion, exécutez la commande 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

Cette commande de connecteur de services effectue les tâches suivantes en arrière-plan :

  • Activer l’identité managée affectée par le système pour l’application $APPSERVICE_NAME hébergée par Azure App Service.

  • Définissez l’utilisateur actuellement connecté comme administrateur Microsoft Entra.

  • Ajoutez un utilisateur de base de données pour l’identité managée affectée par le système à l’étape 1 et accordez tous les privilèges de la base de données $DATABASE_NAME à cet utilisateur. Vous pouvez obtenir le nom d’utilisateur à partir de la chaîne de connexion dans la sortie de la commande précédente.

  • Ajoutez une chaîne de connexion aux paramètres de l’application dans l’application nommée AZURE_MYSQL_CONNECTIONSTRING.

    Remarque

    Si le message d'erreur The subscription is not registered to use Microsoft.ServiceLinker apparaît, exécutez la commande az provider register --namespace Microsoft.ServiceLinker pour enregistrer le fournisseur de ressources du connecteur de services, puis exécutez à nouveau la commande de connexion.

Déployer l’application

Suivez ces étapes pour préparer des données dans une base de données et déployer l’application.

Créer un schéma de la base de données

  1. Ouvrez un pare-feu pour autoriser la connexion à partir de votre adresse IP actuelle.

    # 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}
    
  2. Se connecter à la base de données et créer des tables.

    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
    
  3. Supprimez la règle de pare-feu temporaire.

    az mysql flexible-server firewall-rule delete \
        --resource-group $RESOURCE_GROUP \
        --name $MYSQL_HOST \
        --rule-name AllowCurrentMachineToConnect
    

Déployer l’application

  1. Mettez à jour la chaîne de connexion dans les paramètres de l’application.

    Obtenez la chaîne de connexion générée par le connecteur de services et ajoutez le plug-in d’authentification sans mot de passe. Cette chaîne de connexion est référencée dans le script de démarrage.

    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}"
    
  2. L’exemple d’application contient un fichier pom.xml qui peut générer le fichier WAR. Exécutez la commande suivante pour générer l’application.

    mvn clean package -DskipTests
    
  3. Déployez le fichier WAR et le script de démarrage sur le service d’application.

    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
    

Exemple de test d’application web

Exécutez la commande suivante pour tester l’application.

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

Nettoyer les ressources

Au cours des étapes précédentes, vous avez créé des ressources Azure au sein d’un groupe de ressources. Si vous ne pensez pas avoir besoin de ces ressources à l’avenir, supprimez le groupe de ressources en exécutant la commande suivante dans Cloud Shell :

az group delete --name myResourceGroup

L’exécution de cette commande peut prendre une minute.

Étapes suivantes

Découvrez-en plus sur l’exécution des applications Java sur App Service sur Linux dans le guide du développeur.