Proteja a sua API REST usando o Spring Cloud Azure

Este tutorial mostra-te como ativar a proteção das APIs REST com Microsoft Entra ID numa aplicação Spring Boot.

Este artigo usa um sistema de pesquisa como exemplo. O sistema de pesquisa fornece as seguintes APIs REST:

  • GET /api/survey/question é para visualizar a pesquisa.
  • POST /api/survey é para preencher a pesquisa.
  • GET /api/survey é para visualizar o resultado da pesquisa.

Neste artigo, você protege essas APIs aplicando RBAC (controle de acesso baseado em função) para impor os seguintes requisitos:

  • GET /api/survey/question está disponível para cada solicitação.
  • POST /api/survey está disponível para solicitações de usuários autenticados contendo um token de acesso com o SCOPE_Survey.User escopo concedido.
  • GET /api/survey está disponível para solicitações de usuário administrador autenticadas contendo um token de acesso com o escopo SCOPE_Survey.Admin concedido.

Pré-requisitos

Importante

O Spring Boot versão 2.5 ou superior é necessário para concluir as etapas neste artigo.

Registrar a API REST

Use os seguintes passos para registar a sua API web no portal Azure.

  1. Inicie sessão no portal Azure.

  2. Se você tiver acesso a vários locatários, use o filtro Diretório + assinatura ( ) para selecionar o locatário no qual deseja registrar um aplicativo.

  3. Encontre e selecione Microsoft Entra ID.

  4. Em Gerir, selecione Registos de aplicações>Nova matrícula.

  5. Introduza um nome para a sua aplicação no campo Nome , por exemplo Api-SurveyService. Os usuários do seu aplicativo podem ver esse nome e você pode alterá-lo mais tarde.

  6. Em Tipos de conta suportados, selecione Contas em qualquer diretório organizacional.

  7. Selecione Registrar para criar o aplicativo.

  8. Na página Visão geral do aplicativo, procure o valor da ID do aplicativo (cliente) e registre-o para uso posterior. Você precisa dele para configurar o arquivo de configuração YAML para este projeto.

  9. Em Gerenciar, selecione Expor uma API>Adicionar um escopo. Aceite o URI de ID do Aplicativo proposto (api://{clientId}) selecionando Salvar e continuar e insira as seguintes informações:

    • Em Nome do escopo, digite Survey.User.
    • Em Quem pode consentir, selecione Administradores e usuários.
    • Para Nome de exibição do consentimento do administrador, introduza Access the survey service as a user..
    • Para Descrição do consentimento do administrador, insira Allows the users to write data in survey system..
    • Para Nome de exibição do Consentimento do usuário, digite Access the survey service as a user..
    • Para Descrição do consentimento do utilizador, introduza Allows the users to write data in survey system..
    • Para Estado, mantenha Ativado.
    • Selecione Adicionar escopo.
  10. Repita a etapa anterior para adicionar outro escopo. Ao selecionar Adicionar um escopo, insira as seguintes informações:

    • Em Nome do escopo, digite Survey.Admin.
    • Em Quem pode consentir, selecione Administradores e usuários.
    • Para Nome de exibição do consentimento do administrador, introduza Access the survey service as a admin..
    • Para Descrição do consentimento do administrador, insira Allows the users to view data in survey system..
    • Para Nome de exibição do Consentimento do usuário, digite Access the survey service as a admin..
    • Para Descrição do consentimento do utilizador, introduza Allows the users to view data in survey system..
    • Para Estado, mantenha Ativado.
    • Selecione Adicionar escopo.

Ativar o Spring Cloud Azure Starter Microsoft Entra ID

De seguida, ative a proteção da API REST com o Spring Cloud Azure.

Adicionar dependências de segurança

Para instalar o módulo Spring Cloud Azure Starter Azure Active Directory, adicione as seguintes dependências ao seu ficheiro pom.xml:

  • A Lista de Materiais 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>
    

    Observação

    Se estiveres a usar o Spring Boot 4.0.x, define a spring-cloud-azure-dependencies versão para 7.4.0.

    Se estiveres a usar o Spring Boot 3.5.x, define a spring-cloud-azure-dependencies versão para 6.5.0.

    Se estiveres a usar o Spring Boot 3.1.x-3.5.x, certifica-te de definir a spring-cloud-azure-dependencies versão para 5.25.0.

    Se você estiver usando o Spring Boot 2.x, certifique-se de definir a versão spring-cloud-azure-dependencies como 4.20.0.

    Esta lista de materiais (BOM) deve ser configurada na seção <dependencyManagement> do seu arquivo pom.xml. Isto garante que todas as dependências do Spring Cloud Azure usam a mesma versão.

    Para mais informações sobre a versão usada nesta BOM, veja Qual Versão do Spring Cloud Azure Devo Usar.

  • The Spring Cloud Azure Starter Microsoft Entra artefact:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    
  • Artefato do Spring Boot Starter OAuth2 Resource Server:

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

Autorizar solicitações HTTP

Para proteger as APIs REST de survey, adicione a anotação @PreAuthorize("hasAuthority('SCOPE_Survey.xxx')") com um nome de escopo específico para habilitar a proteção, como mostrado no exemplo a seguir:

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

Atualize a configuração do YAML conforme mostrado no exemplo a seguir:

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>

Observação

Nos tokens v1.0, a configuração requer o ID do cliente da API, enquanto nos tokens v2.0, você pode usar o ID do cliente ou o URI do ID do aplicativo na solicitação. Você pode configurar ambos os elementos para concluir corretamente a validação de público.

Implementar no Azure Spring Apps

Depois de ter o aplicativo Spring Boot em execução localmente, você pode movê-lo para a produção. Azure Spring Apps facilita a implementação de aplicações Spring Boot para Azure sem quaisquer alterações de código. O serviço gerencia a infraestrutura dos aplicativos Spring para que os desenvolvedores possam se concentrar em seu código. O Azure Spring Apps oferece gestão do ciclo de vida através de monitorização e diagnóstico abrangentes, gestão de configuração, descoberta de serviços, integração CI/CD, implementações azul-verde e muito mais. Para mais informações, consulte Quickstart: Implemente a sua primeira aplicação para Azure Spring Apps.

Próximos passos