Share via


Esercitazione: Connessione a un servizio app My database SQL da Java JBoss EAP con connessione senza password

Il Servizio app di Azure fornisce un servizio di hosting Web ad alta scalabilità e con funzioni di auto-correzione in Azure. Fornisce anche un'identità gestita per l'app, una soluzione chiavi in volta per proteggere l'accesso alle Database di Azure per MySQL e ad altri servizi di Azure. Le identità gestite in servizio app rendere l'app più sicura eliminando i segreti dall'app, ad esempio le credenziali nelle variabili di ambiente. In questa esercitazione apprenderai a:

  • Creare un database MySQL.
  • Distribuire un'app JBoss EAP di esempio in app Azure Service usando un pacchetto WAR.
  • Configurare un'applicazione Web Spring Boot per l'uso dell'autenticazione di Microsoft Entra con My database SQL.
  • Connessione a My database SQL con identità gestita tramite Connessione or del servizio.

Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.

Prerequisiti

Clonare l'app di esempio e preparare il repository

Eseguire i comandi seguenti nel terminale per clonare il repository di esempio e configurare l'ambiente dell'app di esempio.

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

Creare un'istanza di Database di Azure per MySQL

Seguire questa procedura per creare un Database di Azure per MySQL nella sottoscrizione. L'app Spring Boot si connette a questo database e archivia i dati durante l'esecuzione, mantenendo lo stato dell'applicazione indipendentemente dalla posizione in cui si esegue l'applicazione.

  1. Accedere all'interfaccia della riga di comando di Azure e, facoltativamente, impostare la sottoscrizione se sono presenti più di una connessione alle credenziali di accesso.

    az login
    az account set --subscription <subscription-ID>
    
  2. Creare un gruppo di risorse di Azure prendendo nota del nome.

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=eastus
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Creare un server Database di Azure per MySQL. Il server viene creato con un account amministratore, ma non viene usato perché si userà l'account amministratore di Microsoft Entra per eseguire attività amministrative.

    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. Creare un database per l'applicazione.

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

Creare un servizio app

Creare una risorsa del servizio app Azure in Linux. JBoss EAP richiede lo 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"

Connessione il database MySQL con connettività di identità

Connettere quindi il database usando Service Connessione or.

Installare l'estensione senza password del servizio Connessione or per l'interfaccia della riga di comando di Azure:

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

Usare quindi il comando seguente per creare un'identità gestita assegnata dall'utente per l'autenticazione di Microsoft Entra. Per altre informazioni, vedere Configurare l'autenticazione di Microsoft Entra per Database di Azure per MySQL - Server flessibile.

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)

Importante

Dopo aver creato l'identità assegnata dall'utente, chiedere all'Amministrazione istrator globale o al ruolo con privilegi Amministrazione istrator di concedere le autorizzazioni seguenti per questa identità: User.Read.All, GroupMember.Read.Alle Application.Read.ALL. Per altre informazioni, vedere la sezione Autorizzazioni dell'autenticazione di Active Directory.

Connettere quindi l'app a un database MySQL con un'identità gestita assegnata dal sistema usando Service Connessione or. Per stabilire questa connessione, eseguire il 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

Questo comando service Connessione or esegue le attività seguenti in background:

  • Abilitare l'identità gestita assegnata dal sistema per l'app $APPSERVICE_NAME ospitata da app Azure Servizio.

  • Impostare l'amministratore di Microsoft Entra sull'utente connesso corrente.

  • Aggiungere un utente del database per l'identità gestita assegnata dal sistema nel passaggio 1 e concedere tutti i privilegi del database $DATABASE_NAME a questo utente. È possibile ottenere il nome utente dal stringa di connessione nell'output del comando precedente.

  • Aggiungere un stringa di connessione ad App Impostazioni nell'app denominata AZURE_MYSQL_CONNECTIONSTRING.

    Nota

    Se viene visualizzato il messaggio The subscription is not registered to use Microsoft.ServiceLinkerdi errore , eseguire il comando az provider register --namespace Microsoft.ServiceLinker per registrare il provider di risorse service Connessione or, quindi eseguire di nuovo il comando di connessione.

Distribuire l'applicazione

Seguire questa procedura per preparare i dati in un database e distribuire l'applicazione.

Creare uno schema di database

  1. Aprire un firewall per consentire la connessione dall'indirizzo IP corrente.

    # 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. Connessione al database e creare tabelle.

    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. Rimuovere la regola del firewall temporanea.

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

Distribuire l'applicazione

  1. Aggiornare il stringa di connessione in App Impostazioni.

    Ottenere il stringa di connessione generato dal Connessione or del servizio e aggiungere il plug-in di autenticazione senza password. Questo stringa di connessione viene fatto riferimento nello script di avvio.

    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'app di esempio contiene un file pom.xml in grado di generare il file WAR. Eseguire il comando seguente per compilare l'app.

    mvn clean package -DskipTests
    
  3. Distribuire WAR e lo script di avvio nel servizio app.

    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
    

Testare un'app Web di esempio

Eseguire il comando seguente per testare l'applicazione.

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

Pulire le risorse

Nei passaggi precedenti sono state create risorse di Azure in un gruppo di risorse. Se si ritiene che queste risorse non saranno necessarie in futuro, eliminare il gruppo di risorse eseguendo questo comando in Cloud Shell:

az group delete --name myResourceGroup

L'esecuzione del comando può richiedere un minuto.

Passaggi successivi

Altre informazioni sull'esecuzione di app Java nel Servizio app in Linux sono disponibili nella Guida per gli sviluppatori.