Cvičení – kódování aplikace v Javě, která používá tajné kódy

Dokončeno

Budete kódovat webovou aplikaci Java pomocí Spring Bootu, která se připojuje k databázi.

Z bezpečnostníchdůvodůch Nejprve ale vytvoříme aplikační infrastrukturu a nakonfigurujeme aplikaci v Javě tak, aby ji používala.

Vytvoření aplikační infrastruktury

V tomto cvičení použijete Azure CLI k vytvoření následujících prostředků:

  • Skupina prostředků Azure, která obsahuje všechny prostředky pro vaši aplikaci.
  • Databázový server PostgreSQL.
  • Cluster Azure Spring Apps a aplikace Spring Boot běžící v tomto clusteru.

Na začátku skriptu musíte zadat některé proměnné prostředí, které by měly být jedinečné v rámci Azure.

Musíte také zadat místní IP adresu pro přístup k databázi z místního počítače. Tato IP adresa by měla být IPv4 adresa. Pokud místní IP adresu neznáte, můžete přejít na následující web: https://www.whatismyip.com/

Nastavte následující proměnné prostředí:

AZ_RESOURCE_GROUP=<YOUR_UNIQUE_RESOURCE_GROUP_NAME>
AZ_DATABASE_USERNAME=<YOUR_POSTGRESQL_USERNAME>
AZ_DATABASE_PASSWORD=<YOUR_POSTGRESQL_PASSWORD>
AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>

Jakmile jsou tyto proměnné prostředí nastavené, můžete k vytvoření prostředků spustit následující příkaz:

AZ_LOCATION=eastus
# Must be all lowercase
AZ_SPRING_CLOUD=spring-${AZ_RESOURCE_GROUP,,}

AZ_DATABASE_NAME=pgsql-${AZ_RESOURCE_GROUP}
AZ_DATABASE_USERNAME=${AZ_DATABASE_USERNAME}

az group create \
    --name $AZ_RESOURCE_GROUP \
    --location $AZ_LOCATION

Provedení tohoto příkazu může trvat i několik minut.

az postgres server create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_NAME \
    --location $AZ_LOCATION \
    --sku-name B_Gen5_1 \
    --storage-size 5120 \
    --admin-user $AZ_DATABASE_USERNAME \
    --admin-password $AZ_DATABASE_PASSWORD
az postgres server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_NAME-database-allow-local-ip \
    --server $AZ_DATABASE_NAME \
    --start-ip-address $AZ_LOCAL_IP_ADDRESS \
    --end-ip-address $AZ_LOCAL_IP_ADDRESS

az postgres server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_NAME-database-allow-azure-ip \
    --server $AZ_DATABASE_NAME \
    --start-ip-address 0.0.0.0 \
    --end-ip-address 0.0.0.0
az postgres db create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name demo \
    --server-name $AZ_DATABASE_NAME

Provedení tohoto příkazu může trvat i několik minut.

az extension add --name spring

az spring create \
   --name $AZ_SPRING_CLOUD \
   --resource-group $AZ_RESOURCE_GROUP \
   --location $AZ_LOCATION \
   --sku Basic

Provedení tohoto příkazu může trvat i několik minut.

az spring app create \
   --resource-group $AZ_RESOURCE_GROUP \
   --service $AZ_SPRING_CLOUD \
   --name application \
   --runtime-version Java_11 \
   --assign-endpoint true

Spuštění těchto skriptů nějakou dobu trvá, takže je můžete nechat běžet na pozadí a mezitím začít programovat aplikaci.

Konfigurace aplikace v Javě

Pomocí příkazu získejte kostru aplikace z https://github.com/Azure-Samples/manage-secrets-in-java-applications úložiště git clone GitHub:

git clone https://github.com/Azure-Samples/manage-secrets-in-java-applications.git

Tato aplikace používá spring Data JPA pro přístup k databázi. Můžete se podívat na rozhraní úložiště CRUD:

package com.example.demo;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ItemRepository extends CrudRepository<Item, Integer> {
}

Data uložená v databázi se pak zveřejňují na webu pomocí kontroleru REST Spring MVC:

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ItemController {

    private final ItemRepository itemRepository;

    public ItemController(ItemRepository itemRepository) {
        this.itemRepository = itemRepository;
    }

    @GetMapping("/")
    String welcome() {
        return "Here are all the database items: " + itemRepository.findAll();
    }
}

Tato data se vkládají do databáze při spuštění pomocí src/main/resources/data.sql souboru:

insert into item (details) values ('This is a item from the database');

Do tohoto souboru můžete přidat další řádky, pokud chcete více dat, nebo pokud ho chcete přizpůsobit.

Pokud chcete získat přístup k databázi, musíte soubor nakonfigurovat src/main/resources/application.properties :

logging.level.org.springframework.jdbc.core=DEBUG

spring.datasource.url=jdbc:postgresql://${azureDatabaseName}.postgres.database.azure.com:5432/demo
spring.datasource.username=${azureDatabaseUsername}@${azureDatabaseName}
spring.datasource.password=${azureDatabasePassword}

spring.sql.init.mode=always

Tento konfigurační soubor má tři proměnné, které je potřeba nakonfigurovat:

  • ${azureDatabaseName} je název databáze PostgreSQL, která byla nakonfigurovaná dříve v AZ_DATABASE_NAME proměnné prostředí. Zadáním echo $AZ_DATABASE_NAME ho zobrazíte.
  • ${azureDatabaseUsername} je název uživatelského jména databáze, které bylo nakonfigurováno dříve v AZ_DATABASE_USERNAME proměnné prostředí. Zadáním echo $AZ_DATABASE_USERNAME ho zobrazíte.
  • ${azureDatabasePassword} je název hesla databáze, které bylo nakonfigurováno dříve v AZ_DATABASE_PASSWORD proměnné prostředí. Zadáním echo $AZ_DATABASE_PASSWORD ho zobrazíte.

Jak jsme viděli v předchozí lekci, je to špatný postup, jak pevně zakódovat tyto hodnoty ve zdrojovém kódu aplikace. K otestování aplikace je ale můžete dočasně napsat a spustit aplikaci:

./mvnw spring-boot:run

Obsah databáze můžete číst tak, že se k kontroleru Spring MVC dostanete pomocí následujícího příkazu nebo pomocí webového prohlížeče:

curl http://localhost:8080

Nasazení aplikace v Javě do Azure

Pokud chcete aplikaci nasadit, musíte ji nejprve zabalit jako soubor Jar:

./mvnw clean package

Tento příkaz vytvoří spustitelný soubor Jar v target adresáři, který nasadíte pomocí Azure CLI:

az spring app deploy \
   --resource-group $AZ_RESOURCE_GROUP \
   --service $AZ_SPRING_CLOUD \
   --name application \
   --artifact-path target/*.jar

Pokud dojde k selháním, můžete se podívat na protokoly aplikace zadáním následujícího příkazu:

az spring app logs \
   --resource-group $AZ_RESOURCE_GROUP \
   --service $AZ_SPRING_CLOUD \
   --name application

Aplikace bude pak dostupná v cloudu a k jejím datům se dostanete pomocí příkazu cURL:

curl https://$AZ_SPRING_CLOUD-application.azuremicroservices.io

# Expected output:
#
# Here are all the database items: [Secret{Id=1, details='This is a item from the database'}]
#

Gratulujeme! Úspěšně jste vytvořili aplikaci Java, která se připojuje k databázi. Teď potřebujete zabezpečit přihlašovací údaje databáze v dalších lekcích.