Share via


Självstudie: Anslut till en MySQL-databas från Java JBoss EAP App Service med lösenordslös anslutning

Azure App Service tillhandahåller en mycket skalbar webbvärdtjänst med självkorrigering i Azure. Den tillhandahåller också en hanterad identitet för din app, vilket är en nyckelfärdig lösning för att skydda åtkomsten till Azure Database for MySQL och andra Azure-tjänster. Hanterade identiteter i App Service gör din app säkrare genom att eliminera hemligheter från din app, till exempel autentiseringsuppgifter i miljövariablerna. I den här självstudien lär du dig att:

  • Skapa en MySQL-databas.
  • Distribuera en JBoss EAP-exempelapp till Azure App Service med hjälp av ett WAR-paket.
  • Konfigurera ett Spring Boot-webbprogram för att använda Microsoft Entra-autentisering med MySQL Database.
  • Anslut till MySQL Database med hanterad identitet med hjälp av Service Anslut or.

Om du inte har en Azure-prenumeration skapar du ett kostnadsfritt Azure-konto innan du börjar.

Förutsättningar

Klona exempelappen och förbered lagringsplatsen

Kör följande kommandon i terminalen för att klona exempelrepo och konfigurera exempelappmiljön.

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

Skapa en Azure Database for MySQL

Följ de här stegen för att skapa en Azure Database for MySQL i din prenumeration. Spring Boot-appen ansluter till den här databasen och lagrar sina data när den körs, vilket bevarar programtillståndet oavsett var du kör programmet.

  1. Logga in på Azure CLI och ange din prenumeration om du har fler än en ansluten till dina inloggningsuppgifter.

    az login
    az account set --subscription <subscription-ID>
    
  2. Skapa en Azure-resursgrupp och notera resursgruppens namn.

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=eastus
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Skapa en Azure Database for MySQL-server. Servern skapas med ett administratörskonto, men den används inte eftersom vi ska använda Microsoft Entra-administratörskontot för att utföra administrativa uppgifter.

    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. Skapa en databas för programmet.

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

Skapa en App Service

Skapa en Azure App Service-resurs i Linux. JBoss EAP kräver 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"

Anslut MySQL-databasen med identitetsanslutning

Anslut sedan databasen med hjälp av Service Anslut or.

Installera tillägget Service Anslut eller passwordless för Azure CLI:

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

Använd sedan följande kommando för att skapa en användartilldelad hanterad identitet för Microsoft Entra-autentisering. Mer information finns i Konfigurera Microsoft Entra-autentisering för Azure Database for MySQL – flexibel server.

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)

Viktigt!

När du har skapat den användartilldelade identiteten ber du din globala administratör eller privilegierade rolladministratör att bevilja följande behörigheter för den här identiteten: User.Read.All, GroupMember.Read.Alloch Application.Read.ALL. Mer information finns i avsnittet Behörigheter i Active Directory-autentisering.

Anslut sedan din app till en MySQL-databas med en systemtilldelad hanterad identitet med hjälp av Service Anslut or. För att upprätta den här anslutningen kör du kommandot 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

Det här Anslut eller-kommandot för tjänsten utför följande uppgifter i bakgrunden:

  • Aktivera systemtilldelad hanterad identitet för appen $APPSERVICE_NAME som hanteras av Azure App Service.

  • Ange Microsoft Entra-administratören till den aktuella inloggade användaren.

  • Lägg till en databasanvändare för den systemtilldelade hanterade identiteten i steg 1 och bevilja alla behörigheter för databasen $DATABASE_NAME till den här användaren. Du kan hämta användarnamnet från anslutningssträng i utdata från föregående kommando.

  • Lägg till en anslutningssträng i App Inställningar i appen med namnet AZURE_MYSQL_CONNECTIONSTRING.

    Kommentar

    Om du ser felmeddelandet The subscription is not registered to use Microsoft.ServiceLinkerkör du kommandot az provider register --namespace Microsoft.ServiceLinker för att registrera tjänstprovidern Anslut eller resursprovidern och kör sedan anslutningskommandot igen.

Distribuera programmet

Följ de här stegen för att förbereda data i en databas och distribuera programmet.

Skapa databasschema

  1. Öppna en brandvägg för att tillåta anslutning från din aktuella IP-adress.

    # 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. Anslut till databasen och skapa tabeller.

    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. Ta bort den tillfälliga brandväggsregeln.

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

Distribuera programmet

  1. Uppdatera anslutningssträng i App Inställningar.

    Hämta anslutningssträng som genereras av Service Anslut eller och lägg till plugin-program för lösenordsfri autentisering. Den här anslutningssträng refereras i startskriptet.

    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. Exempelappen innehåller en pom.xml-fil som kan generera WAR-filen. Kör följande kommando för att skapa appen.

    mvn clean package -DskipTests
    
  3. Distribuera WAR och startskriptet till 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
    

Testa exempelwebbapp

Kör följande kommando för att testa programmet.

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

Rensa resurser

I de föregående stegen skapade du Azure-resurser i en resursgrupp. Om du inte tror att du behöver dessa resurser i framtiden tar du bort resursgruppen genom att köra följande kommando i Cloud Shell:

az group delete --name myResourceGroup

Det kan några minuter att köra kommandot.

Nästa steg

Läs mer om hur du kör Java-appar i App Service på Linux i utvecklarhandboken.