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


Защита 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. В разделе Управлениевыберите Регистрации приложений>Новая регистрация.

  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 Starter Microsoft Entra ID

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

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

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

  • Составная спецификация Spring Cloud Azure (BOM):

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

    Примечание.

    Если вы используете 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, выполнения сине-зеленых развертываний и прочего. Дополнительные сведения см. в статье Краткое руководство. Развертывание первого приложения Azure Spring Apps.

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