Exercițiu - Cod o aplicație Java care utilizează secrete
Veți coda o aplicație Java Web, utilizând Spring Boot, care se conectează la o bază de date.
Din motive de securitate, va trebui să securizați accesul la baza de date în viitor. Dar mai întâi să creăm infrastructura aplicației, apoi să configurăm aplicația Java de utilizat.
Crearea infrastructurii aplicației
În acest exercițiu, utilizați Azure CLI pentru a crea următoarele resurse:
- Un grup de resurse Azure care conține toate resursele pentru aplicația dvs.
- Un server de baze de date PostgreSQL.
- Un cluster Azure Spring Apps și o aplicație Spring Boot care rulează în acest cluster.
Trebuie să furnizați unele variabile de mediu la începutul scriptului care ar trebui să fie unic în Azure.
De asemenea, trebuie să furnizați adresa IP locală pentru a accesa baza de date de pe computerul local. Această adresă IP ar trebui să fie o adresă IPv4. Dacă nu știți adresa IP locală, puteți să accesați site-ul web următor: https://www.whatismyip.com/
Setați următoarele variabile de mediu:
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>
După ce sunt setate aceste variabile de mediu, puteți rula următoarea comandă pentru a crea resursele:
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
Finalizarea acestei comenzi poate dura câteva minute.
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
Finalizarea acestei comenzi poate dura câteva minute.
az extension add --name spring
az spring create \
--name $AZ_SPRING_CLOUD \
--resource-group $AZ_RESOURCE_GROUP \
--location $AZ_LOCATION \
--sku Basic
Finalizarea acestei comenzi poate dura câteva minute.
az spring app create \
--resource-group $AZ_RESOURCE_GROUP \
--service $AZ_SPRING_CLOUD \
--name application \
--runtime-version Java_11 \
--assign-endpoint true
Rularea acestor scripturi durează ceva timp, astfel încât să le permiteți să ruleze în fundal și să înceapă să codeze aplicația între timp.
Configurarea aplicației Java
Obțineți scheletul aplicației din depozitul https://github.com/Azure-Samples/manage-secrets-in-java-applications GitHub, utilizând comanda git clone:
git clone https://github.com/Azure-Samples/manage-secrets-in-java-applications.git
Această aplicație utilizează Spring Data JPA pentru a accesa baza de date. Puteți consulta interfața depozitului CRUD:
package com.example.demo;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ItemRepository extends CrudRepository<Item, Integer> {
}
Datele stocate în baza de date sunt apoi expuse pe web, utilizând un controler 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();
}
}
Aceste date sunt inserate în baza de date la momentul pornirii, utilizând fișierul src/main/resources/data.sql:
insert into item (details) values ('This is a item from the database');
Puteți adăuga mai multe linii la acest fișier dacă doriți mai multe date sau dacă doriți să le particularizați.
Pentru a accesa baza de date, trebuie să configurați fișierul 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
Acest fișier de configurare are trei variabile care trebuie configurate:
-
${azureDatabaseName}este numele bazei de date PostgreSQL care a fost configurată anterior în variabila de mediuAZ_DATABASE_NAME. Tastațiecho $AZ_DATABASE_NAMEpentru a-l vedea. -
${azureDatabaseUsername}este numele numelui de utilizator al bazei de date care a fost configurat anterior în variabila de mediuAZ_DATABASE_USERNAME. Tastațiecho $AZ_DATABASE_USERNAMEpentru a-l vedea. -
${azureDatabasePassword}este numele parolei bazei de date care a fost configurată anterior în variabila de mediuAZ_DATABASE_PASSWORD. Tastațiecho $AZ_DATABASE_PASSWORDpentru a-l vedea.
După cum am văzut în unitatea anterioară, este o practică proastă să codați acele valori din codul sursă al aplicației. Dar pentru a testa aplicația, puteți să le scrieți temporar și să rulați aplicația:
./mvnw spring-boot:run
Puteți citi conținutul bazei de date accesând controlerul MVC Spring utilizând următoarea comandă sau utilizând un browser web:
curl http://localhost:8080
Implementarea aplicației Java în Azure
Pentru a implementa aplicația, trebuie mai întâi să o împachetați ca fișier Jar:
./mvnw clean package
Această comandă produce un fișier Jar executabil în directorul target, pe care îl implementați utilizând Azure CLI:
az spring app deploy \
--resource-group $AZ_RESOURCE_GROUP \
--service $AZ_SPRING_CLOUD \
--name application \
--artifact-path target/*.jar
Dacă întâmpinați erori, puteți consulta jurnalele de aplicații tastând următoarea comandă:
az spring app logs \
--resource-group $AZ_RESOURCE_GROUP \
--service $AZ_SPRING_CLOUD \
--name application
Aplicația va fi disponibilă apoi în cloud și îi puteți accesa datele utilizând o comandă 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'}]
#
Felicitări! Ați creat cu succes o aplicație Java care se conectează la o bază de date! Acum trebuie să securizați acreditările bazei de date în următoarele unități.