Zabezpečení rozhraní REST API pomocí služby Spring Cloud Azure

V tomto kurzu se dozvíte, jak povolit ochranu rozhraní REST API pomocí Microsoft Entra ID v aplikaci Spring Boot.

Tento článek používá jako příklad systém průzkumu. Systém průzkumu poskytuje následující rozhraní REST API:

  • GET /api/survey/question je pro zobrazení průzkumu.
  • POST /api/survey je pro vyplnění průzkumu.
  • GET /api/survey je pro zobrazení výsledku průzkumu.

V tomto článku chráníte tato rozhraní API použitím řízení přístupu na základě role (RBAC) k vynucení následujících požadavků:

  • GET /api/survey/question je k dispozici pro každou žádost.
  • POST /api/survey je k dispozici pro požadavky ověřených uživatelů obsahující přístupový token s uděleným oborem SCOPE_Survey.User.
  • GET /api/survey je k dispozici pro žádosti ověřených uživatelů s oprávněními správce, které obsahují přístupový token s uděleným oborem SCOPE_Survey.Admin.

Požadavky

Důležitý

K dokončení kroků v tomto článku se vyžaduje Spring Boot verze 2.5 nebo vyšší.

Registrace rozhraní REST API

Pomocí následujícího postupu zaregistrujte webové rozhraní API na portálu Azure.

  1. Přihlaste se k portálu Azure.

  2. Pokud máte přístup k více tenantům, pomocí filtru Directory + předplatného () vyberte tenanta, ve kterém chcete aplikaci zaregistrovat.

  3. Najděte a vyberte Microsoft Entra ID.

  4. V části Manage vyberte Registrace aplikací>Nová registrace.

  5. Do pole Název zadejte název aplikace, například Api-SurveyService. Uživatelé vaší aplikace můžou vidět tento název a později ho můžete změnit.

  6. U podporovaných typů účtů vyberte Účty v libovolném adresáři organizace.

  7. Vyberte Zaregistrovat a vytvořte aplikaci.

  8. Na stránce Přehled aplikace vyhledejte hodnotu ID aplikace (klienta) a potom ji poznamenejte pro pozdější použití. Potřebujete ho ke konfiguraci konfiguračního souboru YAML pro tento projekt.

  9. V části Spravovat vyberte Zveřejnit rozhraní API>Přidat obor. Přijměte navrhovaný identifikátor URI ID aplikace (api://{clientId}) tak, že vyberete Uložit a pokračovat a pak zadáte následující informace:

    • Jako název oboruzadejte Survey.User.
    • V Kdo může souhlasit, vyberte Správci a uživatelé.
    • Pro zobrazený název souhlasu správce zadejte .
    • U popisu souhlasu správce zadejte Allows the users to write data in survey system..
    • Pro zobrazované jméno souhlasu uživatelezadejte Access the survey service as a user..
    • Pro popis souhlasu uživatele zadejte .
    • Pro Stav ponechte Povoleno.
    • Vyberte Přidat rozsah.
  10. Opakováním předchozího kroku přidejte další obor. Když vyberete Přidat obor, zadejte následující informace:

    • Jako název oboruzadejte Survey.Admin.
    • V Kdo může souhlasit, vyberte Správci a uživatelé.
    • Pro zobrazený název souhlasu správce zadejte .
    • U popisu souhlasu správce zadejte Allows the users to view data in survey system..
    • Pro zobrazované jméno souhlasu uživatelezadejte Access the survey service as a admin..
    • Pro popis souhlasu uživatele zadejte .
    • Pro Stav ponechte Povoleno.
    • Vyberte Přidat rozsah.

Povolte Microsoft Entra ID Starter pro Spring Cloud Azure

Dále povolte ochranu rozhraní REST API s Azure Spring Cloud.

Přidejte závislosti zabezpečení

Pokud chcete nainstalovat modul Spring Cloud Azure Starter Azure Active Directory, přidejte do souboru pom.xml následující závislosti:

  • 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>
    

    Poznámka

    Pokud používáte Spring Boot 4.0.x, nastavte spring-cloud-azure-dependencies verzi na 7.4.0hodnotu .

    Pokud používáte Spring Boot 3.5.x, nastavte spring-cloud-azure-dependencies verzi na 6.5.0hodnotu .

    Pokud používáte Spring Boot 3.1.x-3.5.x, nezapomeňte nastavit verzi na spring-cloud-azure-dependencies.

    Pokud používáte Spring Boot 2.x, nezapomeňte nastavit spring-cloud-azure-dependencies verzi na 4.20.0.

    Tato faktura materiálu (BOM) by měla být nakonfigurována v <dependencyManagement> části vašeho pom.xml souboru. Tím zajistíte, že všechny závislosti Spring Cloud Azure budou používat stejnou verzi.

    Další informace o verzi použité pro tento kusovník najdete v tématu Kterou verzi Spring Cloud Azure bych měl použít.

  • Artefakt úvodního Microsoft Entra Azure Spring Cloudu:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    
  • Artefakt Spring Boot Starter pro server prostředků OAuth2:

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

Autorizace požadavků HTTP

Pokud chcete chránit rozhraní REST API průzkumu, přidejte poznámku @PreAuthorize("hasAuthority('SCOPE_Survey.xxx')") s konkrétním názvem oboru, abyste povolili ochranu, jak je znázorněno v následujícím příkladu:

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

Aktualizujte konfiguraci YAML, jak je znázorněno v následujícím příkladu:

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>

Poznámka

V tokenech v1.0 konfigurace vyžaduje ID klienta rozhraní API, zatímco v tokenech v2.0 můžete v požadavku použít ID klienta nebo identifikátor URI ID aplikace. Obě možnosti můžete nakonfigurovat tak, aby správně dokončily ověřování cílové skupiny.

Nasazení do Azure Spring Apps

Jakmile budete mít aplikaci Spring Boot spuštěnou místně, můžete ji přesunout do produkčního prostředí. Azure Spring Apps usnadňuje nasazování aplikací Spring Boot do Azure bez jakýchkoli změn kódu. Služba spravuje infrastrukturu aplikací Spring, aby se vývojáři mohli soustředit na svůj kód. Azure Spring Apps poskytuje správu životního cyklu pomocí komplexního monitorování a diagnostiky, správy konfigurace, zjišťování služeb, integrace CI/CD, modrých zelených nasazení a dalších. Další informace najdete v tématu Quickstart: Nasazení první aplikace do Azure Spring Apps.

Další kroky