تمرين - ترميز تطبيق Java يستخدم أسرارًا

مكتمل

ستقوم بترميز تطبيق ويب Java، باستخدام Spring Boot، الذي يتصل بقاعدة بيانات.

لأسباب أمنية، ستحتاج إلى تأمين الوصول إلى قاعدة البيانات هذه في المستقبل. ولكن أولاً دعونا نُنشئ البنية الأساسية للتطبيق، ومن ثمّ تكوين تطبيق Java لاستخدامها.

إنشاء البنية الأساسية للتطبيق

في هذا التمرين، يمكنك استخدام Azure CLI لإنشاء الموارد التالية:

  • مجموعة موارد Azure التي تحتوي على جميع الموارد لتطبيقك.
  • خادم قاعدة بيانات PostgreSQL.
  • نظام مجموعة Azure Spring Apps وتطبيق Spring Boot يعمل داخل هذه المجموعة.

تحتاج إلى توفير بعض متغيرات البيئة في بداية البرنامج النصي التي يجب أن تكون فريدة عبر Azure.

تحتاج أيضًا إلى توفير عنوان IP المحلي الخاص بك للوصول إلى قاعدة البيانات من الكمبيوتر المحلي الخاص بك. يجب أن يكون عنوان IP هذا عنوان IPv4. إذا كنت لا تعرف عنوان IP المحلي الخاص بك، يمكنك الانتقال إلى موقع الويب التالي: https://www.whatismyip.com/

عيّن متغيرات البيئة التالية:

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>

بمجرد تعيين متغيرات البيئة هذه، يمكنك تشغيل الأمر التالي لإنشاء الموارد:

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

قد يستغرق إتمام هذا الأمر عدة دقائق.

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

قد يستغرق إتمام هذا الأمر عدة دقائق.

az extension add --name spring

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

قد يستغرق إتمام هذا الأمر عدة دقائق.

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

تستغرق هذه البرامج النصية بعض الوقت للتشغيل، حتى تتمكن من السماح لها بالتشغيل في الخلفية وبدء ترميز التطبيق في هذه الأثناء.

تكوين تطبيق Java

احصل على هيكل التطبيق من مستودع GitHub https://github.com/Azure-Samples/manage-secrets-in-java-applications، باستخدام الأمر git clone:

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

يستخدم هذا التطبيق Spring Data JPA للوصول إلى قاعدة البيانات. يمكنك إلقاء نظرة على واجهة CRUD Repository:

package com.example.demo;

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

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

يتم بعد ذلك كشف البيانات المخزنة في قاعدة البيانات على الويب، باستخدام وحدة تحكم Spring MVC REST:

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();
    }
}

يتم إدراج هذه البيانات في قاعدة البيانات في وقت بدء التشغيل، باستخدام ملف src/main/resources/data.sql:

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

يمكنك إضافة المزيد من الأسطر إلى هذا الملف إذا كنت تريد المزيد من البيانات، أو إذا كنت ترغب في تخصيصه.

للوصول إلى قاعدة البيانات، تحتاج إلى تكوين 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

يحتوي ملف التكوين هذا على ثلاثة متغيرات يجب تكوينها:

  • ${azureDatabaseName} هو اسم قاعدة بيانات PostgreSQL التي تم تكوينها مسبقًا في متغير البيئة AZ_DATABASE_NAME. اكتب echo $AZ_DATABASE_NAME لرؤيته.
  • ${azureDatabaseUsername} هو الاسم الخاص باسم مستخدم قاعدة البيانات التي تم تكوينها مسبقًا في متغير البيئة AZ_DATABASE_USERNAME. اكتب echo $AZ_DATABASE_USERNAME لرؤيته.
  • ${azureDatabasePassword} هو اسم كلمة مرور قاعدة البيانات التي تم تكوينها مسبقًا في متغير البيئة AZ_DATABASE_PASSWORD. اكتب echo $AZ_DATABASE_PASSWORD لرؤيته.

كما رأينا في الوحدة السابقة، من الممارسات السيئة ترميز تلك القيم في التعليمات البرمجية المصدر للتطبيق. ولكن لاختبار التطبيق، يمكنك كتابتها مؤقتًا وتشغيل التطبيق:

./mvnw spring-boot:run

يمكنك قراءة محتوى قاعدة البيانات عن طريق الوصول إلى وحدة تحكم Spring MVC باستخدام الأمر التالي أو باستخدام مستعرض ويب:

curl http://localhost:8080

توزيع تطبيق Java إلى Azure

لنشر التطبيق، تحتاج أولا إلى حزمه كملف Jar:

./mvnw clean package

ينتج عن هذا الأمر ملف Jar قابل للتنفيذ في target الدليل، الذي تقوم بنشره باستخدام Azure CLI:

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

إذا واجهت حالات فشل، يمكنك إلقاء نظرة على سجلات التطبيق عن طريق كتابة الأمر التالي:

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

سيكون التطبيق متاحًا في السحابة بعد ذلك، ويمكنك الوصول إلى بياناته باستخدام أمر 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'}]
#

تهانينا! لقد نجحت في إنشاء تطبيق Java يتصل بقاعدة بيانات! الآن تحتاج إلى تأمين بيانات اعتماد قاعدة البيانات في الوحدات التالية.