Compartir a través de


Protección de la API REST mediante Spring Cloud Azure

En este tutorial se muestra cómo habilitar la protección de las API REST con Microsoft Entra ID en una aplicación de Spring Boot.

En este artículo se usa un sistema de encuestas como ejemplo. El sistema de encuestas proporciona las siguientes API REST:

  • GET /api/survey/question se utiliza para ver la encuesta.
  • POST /api/survey es para rellenar la encuesta.
  • GET /api/survey es para ver el resultado de la encuesta.

En este artículo, protegerá estas API aplicando el control de acceso basado en rol (RBAC) para aplicar los siguientes requisitos:

  • GET /api/survey/question está disponible para cada solicitud.
  • POST /api/survey está disponible para las solicitudes de usuario autenticadas que contienen un token de acceso con el SCOPE_Survey.User alcance concedido.
  • GET /api/survey está disponible para las solicitudes de usuario administrador autenticadas que contienen un token de acceso con el ámbito SCOPE_Survey.Admin concedido.

Prerrequisitos

Importante

Se requiere Spring Boot versión 2.5 o posterior para completar los pasos descritos en este artículo.

Registro de la API REST

Siga estos pasos para registrar la API web en el portal de Azure.

  1. Inicie sesión en el portal Azure.

  2. Si tiene acceso a varios inquilinos, use el filtro Directorio y suscripción ( ) para seleccionar el inquilino en el que desea registrar una aplicación.

  3. Busque y seleccione Microsoft Entra ID.

  4. En Manage, seleccione App registrations>Nuevo registro.

  5. Escriba un nombre para la aplicación en el campo Nombre , por ejemplo Api-SurveyService. Los usuarios de la aplicación pueden ver este nombre, el cual se puede cambiar más tarde.

  6. En Tipos de cuenta admitidos, seleccione Cuentas en cualquier directorio organizativo.

  7. Seleccione Registrar para crear la aplicación.

  8. En la página Overview (Información general) de la aplicación, busque el valor de Application (client) ID (Id. de cliente de la aplicación) y regístrelo para usarlo más tarde. Debe configurar el archivo de configuración de YAML para este proyecto.

  9. En Administrar, seleccione Exponer una API>Agregar un ámbito. Acepte el URI de identificador de aplicación propuesto (api://{clientId}), seleccione Save and Continue (Guardar y continuar) y escriba la información siguiente:

    • En Nombre de ámbito, escriba Survey.User.
    • En Quién puede dar su consentimiento, seleccione Administradores y usuarios.
    • En Nombre para mostrar del consentimiento del administrador, escriba Access the survey service as a user..
    • En Descripción del consentimiento del administrador, escriba Allows the users to write data in survey system..
    • En Nombre para mostrar del consentimiento del usuario, escriba Access the survey service as a user..
    • En Descripción del consentimiento del usuario, escriba Allows the users to write data in survey system..
    • Para Estado, mantenga Habilitado.
    • Selecciona la opción Agregar un ámbito.
  10. Repita el paso anterior para agregar otro ámbito. Al seleccionar Agregar un ámbito, escriba la siguiente información:

    • En Nombre de ámbito, escriba Survey.Admin.
    • En Quién puede dar su consentimiento, seleccione Administradores y usuarios.
    • En Nombre para mostrar del consentimiento del administrador, escriba Access the survey service as a admin..
    • En Descripción del consentimiento del administrador, escriba Allows the users to view data in survey system..
    • En Nombre para mostrar del consentimiento del usuario, escriba Access the survey service as a admin..
    • En Descripción del consentimiento del usuario, escriba Allows the users to view data in survey system..
    • Para Estado, mantenga Habilitado.
    • Selecciona la opción Agregar un ámbito.

Habilitar Spring Cloud Azure Starter Microsoft Entra ID

A continuación, habilite la protección de la API REST con Spring Cloud Azure.

Agregar dependencias de seguridad

Para instalar el módulo Spring Cloud Azure Starter Azure Active Directory, agregue las siguientes dependencias al archivo pom.xml:

  • La Lista de Materiales (BOM) de Spring Cloud Azure:

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

    Nota:

    Si usa Spring Boot 4.0.x, asegúrese de establecer la versión en spring-cloud-azure-dependencies7.1.0.

    Si usa Spring Boot 3.5.x, asegúrese de establecer la versión spring-cloud-azure-dependencies a 6.1.0.

    Si usa Spring Boot 3.1.x-3.5.x, asegúrese de establecer la versión de spring-cloud-azure-dependencies a 5.25.0.

    Si usa Spring Boot 2.x, asegúrese de establecer la versión de spring-cloud-azure-dependencies en 4.20.0.

    Esta lista de materiales (BOM) debe configurarse en la sección <dependencyManagement> del archivo pom.xml. Esto garantiza que todas las dependencias de Spring Cloud Azure usen la misma versión.

    Para obtener más información sobre la versión usada para esta lista de materiales, consulte Qué versión de Spring Cloud Azure debería usar.

  • El artefacto Microsoft Entra Starter de Spring Cloud Azure:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    
  • El artefacto del servidor de recursos OAuth2 de Spring Boot Starter:

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

Autorización de solicitudes HTTP

Para proteger las API REST de encuesta, agregue la anotación @PreAuthorize("hasAuthority('SCOPE_Survey.xxx')") con un nombre de ámbito concreto para habilitar la protección, como se muestra en el ejemplo siguiente:

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

Actualice la configuración de YAML como se muestra en el ejemplo siguiente:

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:

En los tokens v1.0 la configuración requiere el identificador de cliente de la API, mientras que en los tokens v2.0 puede usar el identificador de cliente o el URI del identificador de la aplicación que aparece en la solicitud. Puede configurar ambos para completar correctamente la validación de la audiencia.

Implementación en Azure Spring Apps

Después de que la aplicación Spring Boot se ejecute localmente, puede moverla a producción. Azure Spring Apps facilita la implementación de aplicaciones de Spring Boot en Azure sin cambios en el código. El servicio administra la infraestructura de las aplicaciones de Spring, con el fin de que los desarrolladores puedan centrarse en el código. Azure Spring Apps proporciona administración del ciclo de vida mediante supervisión y diagnósticos completos, administración de configuración, detección de servicios, integración de CI/CD, implementaciones azul-verde, etc. Para obtener más información, consulte Quickstart: Implementación de la primera aplicación en Azure Spring Apps.

Pasos siguientes