Udostępnij za pośrednictwem


Samouczek: nawiązywanie połączenia z bazą danych MySQL z poziomu usługi App Service EAP Java JBoss przy użyciu połączenia bez hasła

usługa aplikacja systemu Azure Service oferuje wysoce skalowalną, samonastosową usługę hostingu internetowego na platformie Azure. Zapewnia również tożsamość zarządzaną dla aplikacji, która jest rozwiązaniem kluczowym dla zabezpieczania dostępu do usługi Azure Database for MySQL i innych usług platformy Azure. Tożsamości zarządzane w usłudze App Service sprawiają, że aplikacja jest bezpieczniejsza, eliminując wpisy tajne z aplikacji, takie jak poświadczenia w zmiennych środowiskowych.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Utwórz bazę danych MySQL.
  • Wdróż przykładową aplikację JBoss EAP, aby aplikacja systemu Azure Service przy użyciu pakietu WAR.
  • Skonfiguruj aplikację internetową Spring Boot do korzystania z uwierzytelniania entra firmy Microsoft z bazą danych MySQL.
  • Nawiązywanie połączenia z bazą danych MySQL przy użyciu tożsamości zarządzanej przy użyciu łącznika usługi.

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure.

Wymagania wstępne

Sklonuj przykładową aplikację i przygotuj repozytorium

Uruchom następujące polecenia w terminalu, aby sklonować przykładowe repozytorium i skonfigurować przykładowe środowisko aplikacji.

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

Tworzenie usługi Azure Database for MySQL

Wykonaj następujące kroki, aby utworzyć zasób usługi Azure Database for MySQL w ramach subskrypcji. Aplikacja Spring Boot łączy się z tą bazą danych i przechowuje swoje dane podczas działania, utrwalając stan aplikacji bez względu na to, gdzie uruchamiasz aplikację.

  1. Zaloguj się do interfejsu wiersza polecenia platformy Azure i opcjonalnie ustaw subskrypcję, jeśli masz więcej niż jedno połączenie z poświadczeniami logowania.

    az login
    az account set --subscription <subscription-ID>
    
  2. Utwórz grupę zasobów platformy Azure.

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=eastus
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Utwórz serwer usługi Azure Database for MySQL. Serwer jest tworzony przy użyciu konta administratora, ale nie jest używany, ponieważ będziemy używać konta administratora Microsoft Entra do wykonywania zadań administracyjnych.

    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. Utwórz bazę danych dla aplikacji.

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

Tworzenie wystąpienia usługi App Service

Utwórz zasób usługi aplikacja systemu Azure w systemie Linux. Protokół JBoss EAP wymaga jednostki 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"

Łączenie bazy danych MySQL z łącznością tożsamości

Następnie połącz bazę danych przy użyciu łącznika usługi.

  1. Zainstaluj rozszerzenie bez hasła łącznika usługi dla interfejsu wiersza polecenia platformy Azure:

    az extension add --name serviceconnector-passwordless --upgrade
    
  2. Utwórz tożsamość zarządzaną przypisaną przez użytkownika dla uwierzytelniania firmy Microsoft Entra przy użyciu następującego polecenia. Aby uzyskać więcej informacji, zobacz Konfigurowanie uwierzytelniania entra firmy Microsoft dla usługi Azure Database for MySQL — serwer elastyczny.

    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. Poproś administratora globalnego lub administratora ról uprzywilejowanych o przyznanie następujących uprawnień do nowej tożsamości przypisanej przez użytkownika: User.Read.All, GroupMember.Read.Alli Application.Read.ALL. Aby uzyskać więcej informacji, zobacz sekcję Uprawnienia uwierzytelniania usługi Active Directory.

  4. Połącz aplikację z bazą danych MySQL przy użyciu przypisanej przez system tożsamości zarządzanej przy użyciu łącznika usługi. Aby nawiązać to połączenie, uruchom polecenie 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
    

    To polecenie łącznika usługi wykonuje następujące zadania w tle:

    • Włącz tożsamość zarządzaną przypisaną przez system dla aplikacji $APPSERVICE_NAME hostowanej przez usługę aplikacja systemu Azure Service.

    • Ustaw administratora firmy Microsoft Entra na bieżącego zalogowanego użytkownika.

    • Dodaj użytkownika bazy danych dla tożsamości zarządzanej przypisanej przez system w kroku 1 i przyznaj wszystkim uprawnieniem bazy danych $DATABASE_NAME do tego użytkownika. Nazwę użytkownika można pobrać z parametry połączenia w danych wyjściowych z poprzedniego polecenia.

    • Dodaj parametry połączenia do ustawień aplikacji w aplikacji o nazwie AZURE_MYSQL_CONNECTIONSTRING.

      Uwaga

      Jeśli zostanie wyświetlony komunikat The subscription is not registered to use Microsoft.ServiceLinkero błędzie , uruchom polecenie az provider register --namespace Microsoft.ServiceLinker , aby zarejestrować dostawcę zasobów łącznika usługi, a następnie ponownie uruchom polecenie połączenia.

Wdrażanie aplikacji

Wykonaj następujące kroki, aby przygotować dane w bazie danych i wdrożyć aplikację.

Tworzenie schematu bazy danych

  1. Otwórz zaporę, aby zezwolić na połączenie z bieżącego adresu IP.

    # 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. Połącz się z bazą danych i utwórz tabele.

    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. Usuń tymczasową regułę zapory.

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

Wdrażanie aplikacji

  1. Zaktualizuj parametry połączenia w obszarze Ustawienia aplikacji.

    Pobierz parametry połączenia wygenerowaną przez łącznik usługi i dodaj wtyczkę uwierzytelniania bez hasła. Do tego parametry połączenia odwołuje się skrypt uruchamiania.

    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. Przykładowa aplikacja zawiera plik pom.xml , który może wygenerować plik WAR. Uruchom następujące polecenie, aby skompilować aplikację.

    mvn clean package -DskipTests
    
  3. Wdróż plik WAR i skrypt uruchamiania w usłudze 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
    

Testowanie przykładowej aplikacji internetowej

Uruchom następujące polecenie, aby przetestować aplikację.

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

Czyszczenie zasobów

W poprzednich krokach utworzono zasoby platformy Azure w grupie zasobów. Jeśli te zasoby nie będą raczej potrzebne w przyszłości, usuń grupę zasobów, uruchamiając następujące polecenie w usłudze Cloud Shell:

az group delete --name myResourceGroup

Wykonanie tego polecenia może potrwać około minutę.

Następny krok

Dowiedz się więcej na temat uruchamiania aplikacji w języku Java w usłudze App Service dla systemu Linux w przewodniku dla deweloperów.

Java in App Service Linux dev guide (Przewodnik dla deweloperów dotyczący języka Java w usłudze App Service dla systemu Linux)