Mengamankan REST API Anda menggunakan Spring Cloud Azure

Tutorial ini menunjukkan kepada Anda cara mengaktifkan perlindungan REST API dengan Microsoft Entra ID dalam aplikasi Spring Boot.

Artikel ini menggunakan sistem survei sebagai contoh. Sistem survei menyediakan REST API berikut:

  • GET /api/survey/question adalah untuk melihat survei.
  • POST /api/survey adalah untuk mengisi survei.
  • GET /api/survey adalah untuk melihat hasil survei.

Dalam artikel ini, Anda melindungi API ini dengan menerapkan kontrol akses berbasis peran (RBAC) untuk menerapkan persyaratan berikut:

  • GET /api/survey/question tersedia untuk setiap permintaan.
  • POST /api/survey tersedia untuk permintaan pengguna terautentikasi yang berisi token akses dengan cakupan SCOPE_Survey.User yang diberikan.
  • GET /api/survey tersedia untuk permintaan pengguna admin terautentikasi yang berisi token akses dengan cakupan SCOPE_Survey.Admin yang diberikan.

Prasyarat

Penting

Spring Boot versi 2.5 atau yang lebih tinggi diperlukan untuk menyelesaikan langkah-langkah dalam artikel ini.

Mendaftarkan REST API

Gunakan langkah-langkah berikut untuk mendaftarkan API web Anda di portal Azure.

  1. Masuk ke portal Azure.

  2. Jika Anda memiliki akses ke beberapa penyewa, gunakan filter Direktori + langganan ( ) untuk memilih penyewa tempat Anda ingin mendaftarkan aplikasi.

  3. Temukan dan pilih Microsoft Entra ID.

  4. Di bawah Kelola, pilih Pendaftaran aplikasi>Pendaftaran baru.

  5. Masukkan nama untuk aplikasi Anda di bidang Nama , misalnya Api-SurveyService. Pengguna aplikasi Anda mungkin melihat nama ini, dan Anda dapat mengubahnya nanti.

  6. Untuk Jenis akun yang didukung, pilih Akun di direktori organisasi apa pun.

  7. Pilih Daftar untuk membuat aplikasi.

  8. Pada halaman Gambaran Umum aplikasi, cari nilai ID Aplikasi (klien), lalu catat untuk digunakan nanti. Anda memerlukannya untuk mengonfigurasi file konfigurasi YAML untuk proyek ini.

  9. Di bawah Kelola, pilih Ekspos API>Tambahkan cakupan. Terima URI ID Aplikasi yang diusulkan (api://{clientId}) dengan memilih Simpan dan lanjutkan, lalu masukkan informasi berikut:

    • Untuk Nama cakupan, masukkan Survey.User.
    • Untuk Siapa yang dapat menyetujui, pilih Admin dan pengguna .
    • Untuk Nama tampilan persetujuan admin, masukkan Access the survey service as a user..
    • Untuk deskripsi persetujuan Admin , masukkan Allows the users to write data in survey system..
    • Untuk nama tampilan persetujuan pengguna, masukkan Access the survey service as a user..
    • Untuk deskripsi persetujuan pengguna , masukkan Allows the users to write data in survey system..
    • Untuk Status, tetap Aktifkan.
    • Pilih Tambahkan cakupan.
  10. Ulangi langkah sebelumnya untuk menambahkan cakupan lain. Saat Anda memilih Tambahkan cakupan, masukkan informasi berikut:

    • Untuk Nama cakupan, masukkan Survey.Admin.
    • Untuk Siapa yang dapat menyetujui, pilih Admin dan pengguna .
    • Untuk Nama tampilan persetujuan admin, masukkan Access the survey service as a admin..
    • Untuk deskripsi persetujuan Admin , masukkan Allows the users to view data in survey system..
    • Untuk nama tampilan persetujuan pengguna, masukkan Access the survey service as a admin..
    • Untuk deskripsi persetujuan pengguna , masukkan Allows the users to view data in survey system..
    • Untuk Status, tetap Aktifkan.
    • Pilih Tambahkan cakupan.

Mengaktifkan Microsoft Entra ID Spring Cloud Azure Starter

Selanjutnya, aktifkan perlindungan REST API dengan Spring Cloud Azure.

Menambahkan dependensi Keamanan

Untuk menginstal modul Azure Active Directory Spring Cloud Azure Starter, tambahkan dependensi berikut ke file pom.xml Anda:

  • Daftar Komponen Spring Cloud Azure (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>7.4.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Nota

    Jika Anda menggunakan Spring Boot 4.0.x, atur versi ke spring-cloud-azure-dependencies7.4.0.

    Jika Anda menggunakan Spring Boot 3.5.x, atur versi ke spring-cloud-azure-dependencies6.5.0.

    Jika Anda menggunakan Spring Boot 3.1.x-3.5.x, pastikan untuk mengatur versi ke spring-cloud-azure-dependencies5.25.0.

    Jika Anda menggunakan Spring Boot 2.x, pastikan untuk mengatur versi spring-cloud-azure-dependencies ke 4.20.0.

    Bill of Material (BOM) ini harus dikonfigurasi di bagian <dependencyManagement> dari file pom.xml Anda. Ini memastikan bahwa semua dependensi Spring Cloud Azure menggunakan versi yang sama.

    Untuk informasi selengkapnya tentang versi yang digunakan untuk BOM ini, lihat Versi Spring Cloud Azure Harus Saya Gunakan.

  • Artefak Spring Cloud Azure Starter dari Microsoft Entra:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    
  • Artefak Server Sumber Daya Spring Boot Starter OAuth2:

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>
    

Mengotorisasi permintaan HTTP

Untuk melindungi REST API survei, tambahkan anotasi @PreAuthorize("hasAuthority('SCOPE_Survey.xxx')") dengan nama cakupan konkret untuk mengaktifkan perlindungan, seperti yang ditunjukkan dalam contoh berikut:

import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.util.LinkedHashMap;
import java.util.Map;

@RestController
@RequestMapping("/api/survey")
public class SurveyController {

    private static final String QUESTION = "Which sports do you like most?";
    private final Map<LocalDateTime, String> surveys = new LinkedHashMap<>();

    @GetMapping(value = "/question", produces = MediaType.APPLICATION_JSON_VALUE)
    public String question() {
        return QUESTION;
    }

    @PostMapping
    @PreAuthorize("hasAuthority('SCOPE_Survey.User')")
    public String addAnswer(@RequestParam("answer") String answer) {
        if (StringUtils.hasText(answer)) {
            surveys.put(LocalDateTime.now(), answer);
            return "succeeded";
        }
        return "Failed";
    }

    @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    @PreAuthorize("hasAuthority('SCOPE_Survey.Admin')")
    public Map<LocalDateTime, String> list() {
        return surveys;
    }
}

Perbarui konfigurasi YAML seperti yang ditunjukkan dalam contoh berikut:

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        credential:
          client-id: <your-application-ID-of-Api-SurveyService>
        app-id-uri: <your-application-ID-URI-of-Api-SurveyService>

Nota

Dalam token v1.0, konfigurasi memerlukan ID klien API, sementara dalam token v2.0, Anda dapat menggunakan ID klien atau URI ID aplikasi dalam permintaan. Anda dapat mengonfigurasi keduanya untuk menyelesaikan validasi audiens dengan benar.

Menyebarkan ke Azure Spring Apps

Setelah aplikasi Spring Boot berjalan secara lokal, Anda dapat memindahkannya ke produksi. Azure Spring Apps memudahkan penyebaran aplikasi Spring Boot ke Azure tanpa perubahan kode apa pun. Layanan ini mengelola infrastruktur aplikasi Spring sehingga pengembang dapat fokus pada kode mereka. Azure Spring Apps menyediakan manajemen siklus hidup menggunakan pemantauan dan diagnostik yang komprehensif, manajemen konfigurasi, penemuan layanan, integrasi CI/CD, penyebaran biru-hijau, dan banyak lagi. Untuk informasi selengkapnya, lihat Quickstart: Menyebarkan aplikasi pertama Anda ke Azure Spring Apps.

Langkah berikutnya