Delen via


Zelfstudie: Verbinding maken met een MySQL-database vanuit Java JBoss EAP App Service met een wachtwoordloze verbinding

Azure App Service biedt een uiterst schaalbare webhostingservice met self-patchfunctie in Azure. Het biedt ook een beheerde identiteit voor uw app, een kant-en-klare oplossing voor het beveiligen van de toegang tot Azure Database for MySQL en andere Azure-services. Beheerde identiteiten in App Service maken uw app veiliger door geheimen uit uw app te elimineren, zoals referenties in de omgevingsvariabelen.

In deze zelfstudie leert u het volgende:

  • Maak een MySQL-database.
  • Implementeer een JBoss EAP-voorbeeld-app in Azure-app Service met behulp van een WAR-pakket.
  • Configureer een Spring Boot-webtoepassing voor het gebruik van Microsoft Entra-verificatie met MySQL Database.
  • Maak verbinding met MySQL Database met Managed Identity met behulp van Service Connector.

Als u geen Azure-abonnement hebt, kunt u een gratis Azure-account maken voordat u begint.

Vereisten

De voorbeeld-app klonen en de opslagplaats voorbereiden

Voer de volgende opdrachten in de terminal uit om de voorbeeldopslagplaats te klonen en de omgeving van de voorbeeld-app in te stellen.

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

Een Azure Database for MySQL maken

Volg deze stappen om een Azure Database for MySQL-resource te maken in uw abonnement. De Spring Boot-app maakt verbinding met deze database en slaat de bijbehorende gegevens op wanneer deze wordt uitgevoerd, waardoor de toepassingsstatus behouden blijft, ongeacht waar u de toepassing uitvoert.

  1. Meld u aan bij de Azure CLI en stel eventueel uw abonnement in als er meerdere zijn verbonden met uw aanmeldingsreferenties.

    az login
    az account set --subscription <subscription-ID>
    
  2. Maak een Azure-resourcegroep.

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=eastus
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Maak een Azure-database voor MySQL-server. De server wordt gemaakt met een beheerdersaccount, maar wordt niet gebruikt omdat we het Microsoft Entra-beheerdersaccount gaan gebruiken om beheertaken uit te voeren.

    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. Maak een database voor de toepassing.

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

Een App Service-instantie maken

Maak een Azure-app Service-resource in Linux. JBoss EAP vereist 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"

De MySQL-database verbinden met identiteitsconnectiviteit

Verbind vervolgens de database met behulp van Service Connector.

  1. Installeer de serviceconnector-extensie zonder wachtwoord voor de Azure CLI:

    az extension add --name serviceconnector-passwordless --upgrade
    
  2. Maak een door de gebruiker toegewezen beheerde identiteit voor Microsoft Entra-verificatie met behulp van de volgende opdracht. Zie Microsoft Entra-verificatie instellen voor Azure Database for MySQL - Flexible Server voor meer informatie.

    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)
    
  3. Vraag de globale beheerder of bevoorrechte rolbeheerder om de volgende machtigingen te verlenen aan de nieuwe door de gebruiker toegewezen identiteit: User.Read.All, GroupMember.Read.Allen Application.Read.ALL. Zie de sectie Machtigingen van Active Directory-verificatie voor meer informatie.

  4. Verbind uw app met een MySQL-database met een door het systeem toegewezen beheerde identiteit met behulp van Service Connector. Voer de opdracht az webapp connection create uit om deze verbinding te maken .

    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
    

    Met deze opdracht serviceconnector worden de volgende taken op de achtergrond uitgevoerd:

    • Schakel door het systeem toegewezen beheerde identiteit in voor de app $APPSERVICE_NAME die wordt gehost door Azure-app Service.

    • Stel de Microsoft Entra-beheerder in op de huidige aangemelde gebruiker.

    • Voeg in stap 1 een databasegebruiker toe voor de door het systeem toegewezen beheerde identiteit en verdeel alle bevoegdheden van de database $DATABASE_NAME aan deze gebruiker. U kunt de gebruikersnaam ophalen uit de verbindingsreeks in de uitvoer van de vorige opdracht.

    • Voeg een verbindingsreeks toe aan app-instellingen in de app met de naam AZURE_MYSQL_CONNECTIONSTRING.

      Notitie

      Als u het foutbericht The subscription is not registered to use Microsoft.ServiceLinkerziet, voert u de opdracht az provider register --namespace Microsoft.ServiceLinker uit om de resourceprovider van de serviceconnector te registreren en voert u de verbindingsopdracht opnieuw uit.

De toepassing implementeren

Volg deze stappen om gegevens in een database voor te bereiden en de toepassing te implementeren.

Databaseschema maken

  1. Open een firewall om verbinding vanaf uw huidige IP-adres toe te staan.

    # 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. Maak verbinding met de database en maak tabellen.

    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. Verwijder de tijdelijke firewallregel.

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

De toepassing implementeren

  1. Werk de verbindingsreeks bij in app-instellingen.

    Haal de verbindingsreeks op die door Service Connector is gegenereerd en voeg de invoegtoepassing voor verificatie zonder wachtwoord toe. Naar deze verbindingsreeks wordt verwezen in het opstartscript.

    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. De voorbeeld-app bevat een pom.xml-bestand dat het WAR-bestand kan genereren. Voer de volgende opdracht uit om de app te bouwen.

    mvn clean package -DskipTests
    
  3. Implementeer de WAR en het opstartscript in de app-service.

    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
    

Voorbeeldweb-app testen

Voer de volgende opdracht uit om de toepassing te testen.

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

Resources opschonen

In de voorgaande stappen hebt u Azure-resources in een resourcegroep gemaakt. Als u deze resources niet meer nodig denkt te hebben, verwijdert u de resourcegroep door de volgende opdracht in Cloud Shell uit te voeren:

az group delete --name myResourceGroup

Het kan een minuut duren voordat deze opdracht is uitgevoerd.

Volgende stap

Lees meer over het uitvoeren van Java-apps in Azure App Service in Linux in de handleiding voor ontwikkelaars.