Поделиться через


Защита REST API с помощью Spring Cloud Azure

В этом руководстве показано, как включить защиту REST API с помощью Microsoft Entra ID в приложении Spring Boot.

В этой статье в качестве примера используется система опроса. Система опроса предоставляет следующие ИНТЕРФЕЙСЫ REST API:

  • GET /api/survey/question — это просмотр опроса.
  • POST /api/survey предназначен для заполнения опроса.
  • GET /api/survey для просмотра результата опроса.

В этой статье вы защищаете эти API, применяя управление доступом на основе ролей (RBAC) для соблюдения следующих требований:

  • GET /api/survey/question доступен по каждому запросу.
  • POST /api/survey доступен для авторизованных запросов пользователей, содержащих токен доступа с предоставленной областью SCOPE_Survey.User.
  • GET /api/survey доступен для запросов аутентифицированных пользователей-администраторов, содержащих токен доступа с предоставленной областью SCOPE_Survey.Admin.

Предпосылки

Это важно

Для выполнения действий, описанных в этой статье, требуется spring Boot версии 2.5 или более поздней.

Регистрация REST API

Выполните следующие действия, чтобы зарегистрировать веб-API на портале Azure.

  1. Войдите на портал Azure.

  2. Если у вас есть доступ к нескольким клиентам, используйте фильтр каталогов и подписок ( ) для выбора клиента, в котором требуется зарегистрировать приложение.

  3. Найдите и выберите Microsoft Entra ID.

  4. В разделе Manage выберите App registrations>New registration.

  5. Введите имя приложения в поле "Имя ", например Api-SurveyService. Пользователи приложения могут увидеть это имя, и вы можете изменить его позже.

  6. Для поддерживаемых типов учетных записей выберите "Учетные записи" в любом каталоге организации.

  7. Выберите Зарегистрировать, чтобы создать приложение.

  8. На странице приложения Обзор найдите идентификатор приложения (клиента) и запишите его, чтобы использовать позже. Вам потребуется настроить файл конфигурации YAML для этого проекта.

  9. В разделе "Управление" выберите "Открыть API">"Добавить область действия". Примите предлагаемый URI идентификатора приложения (api://{clientId}) , выбрав "Сохранить и продолжить", а затем введите следующие сведения:

    • В поле Имя области введите Survey.User.
    • Для , кто может предоставить согласие, выберите Администраторы и пользователи.
    • Для отображаемого имени согласия администратора введитеAccess the survey service as a user..
    • Для описания согласия администраторавведите Allows the users to write data in survey system..
    • В поле отображаемое имя согласия пользователявведите Access the survey service as a user..
    • Для описания согласия пользователявведите Allows the users to write data in survey system..
    • Для параметра Состояние оставьте значение Включено.
    • Выберите Добавить область.
  10. Повторите предыдущий шаг, чтобы добавить другую область. При выборе Добавить областьвведите следующие сведения:

    • В поле Имя области введите Survey.Admin.
    • Для , кто может предоставить согласие, выберите Администраторы и пользователи.
    • Для отображаемого имени согласия администратора введитеAccess the survey service as a admin..
    • Для описания согласия администраторавведите Allows the users to view data in survey system..
    • В поле отображаемое имя согласия пользователявведите Access the survey service as a admin..
    • Для описания согласия пользователявведите Allows the users to view data in survey system..
    • Для параметра Состояние оставьте значение Включено.
    • Выберите Добавить область.

Включите стартер Spring Cloud Azure Microsoft Entra ID

Затем включите защиту REST API с помощью Spring Cloud Azure.

Добавление зависимостей безопасности

Чтобы установить модуль Spring Cloud Azure Starter для Azure Active Directory, добавьте следующие зависимости в файл pom.xml:

  • Список компонентов (BOM) 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>
    

    Примечание.

    Если вы используете Spring Boot 4.0.x, обязательно установите версию, указанную в spring-cloud-azure-dependencies, на значение 7.1.0.

    Если вы используете Spring Boot 3.5.x, обязательно задайте версию spring-cloud-azure-dependencies на 6.1.0.

    Если вы используете Spring Boot 3.1.x-3.5.x, обязательно установите для нее версию spring-cloud-azure-dependencies на 5.25.0.

    Если вы используете Spring Boot 2.x, обязательно установите версию spring-cloud-azure-dependencies на 4.20.0.

    Эта ведомость материалов (BOM) должна быть сконфигурирована в <dependencyManagement> разделе файла pom.xml. Это гарантирует, что все зависимости Spring Cloud Azure используют одну и ту же версию.

    Дополнительные сведения о версии, используемой для этого BOM, можно найти в разделе Какую версию Spring Cloud Azure мне следует использовать?.

  • Артефакт Microsoft Entra для Spring Cloud Azure Starter:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    
  • Артефакт стартового сервера ресурсов OAuth2 Spring Boot.

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

Авторизация HTTP-запросов

Чтобы защитить REST API опроса, добавьте заметку @PreAuthorize("hasAuthority('SCOPE_Survey.xxx')") с конкретным именем области, чтобы включить защиту, как показано в следующем примере:

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

Обновите конфигурацию YAML, как показано в следующем примере:

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>

Примечание.

В маркерах версии 1.0 конфигурация требует идентификатор клиента API, а в маркерах версии 2.0 можно использовать идентификатор клиента или URI идентификатора приложения в запросе. Вы можете настроить оба элемента для корректного выполнения проверки аудитории.

Развертывание в Azure Spring Apps

После локального запуска приложения Spring Boot его можно переместить в рабочую среду. Azure Spring Apps упрощает развертывание приложений Spring Boot для Azure без каких-либо изменений кода. Служба управляет инфраструктурой приложений Spring, чтобы разработчики могли сосредоточиться на коде. Azure Spring Apps обеспечивает управление жизненным циклом с помощью комплексного мониторинга и диагностики, управления конфигурацией, обнаружения служб, интеграции CI/CD, развертывания по схеме blue-green и многого другого. Дополнительные сведения см. в статье Quickstart: развертывание первого приложения в Azure Spring Apps.

Дальнейшие действия