Spring Cloud Azure を使用して REST API をセキュリティで保護する

このチュートリアルでは、Spring Boot アプリケーションで Microsoft Entra ID を使用して REST API 保護を有効にする方法について説明します。

この記事では、調査システムを例として使用します。 アンケート システムには、次の REST API が用意されています。

  • GET /api/survey/question はアンケートを表示するために使用されます。
  • POST /api/survey はアンケートに記入するためのものです。
  • GET /api/survey アンケート結果を表示します。

この記事では、ロールベースのアクセス制御 (RBAC) を適用して次の要件を適用することで、これらの API を保護します。

  • GET /api/survey/question は要求ごとに使用できます。
  • POST /api/survey は、SCOPE_Survey.User スコープが付与されたアクセス トークンを含む認証済みユーザー要求で使用できます。
  • GET /api/survey は、SCOPE_Survey.Admin スコープが付与されたアクセス トークンを含む認証済みの管理者ユーザー要求で使用できます。

前提 条件

  • Azure サブスクリプション - 無料で作成。
  • Java Development Kit (JDK) バージョン 8 以降。
  • アパッチ・メイヴン
  • Azure CLI
  • Microsoft Entra インスタンス。 作成手順については、「Quickstart: Microsoft Entra IDを参照してください。
  • Spring Boot アプリケーション。 まだない場合は、 Spring Initializr を使用して Maven プロジェクトを作成します。 必ず Maven Project を選択し、DependenciesSpring Web、OAuth2 リソース サーバー、および Microsoft Entra ID 依存関係を追加し、バージョン 8 以降Java選択します。

重要

この記事の手順を完了するには、Spring Boot バージョン 2.5 以降が必要です。

REST API を登録する

Azure ポータルで Web API を登録するには、次の手順に従います。

  1. Azure ポータルにサインインします。

  2. 複数のテナントにアクセスできる場合は、ディレクトリ + サブスクリプション フィルター () を使用して、アプリケーションを登録するテナントを選択します。

  3. Microsoft Entra IDを見つけて選択します。

  4. [Manage で、アプリの登録>New registration を選択します。

  5. [名] フィールドにアプリケーションの名前を入力します (例: Api-SurveyService)。 アプリのユーザーにこの名前が表示される場合があり、後で変更できます。

  6. [サポートされているアカウントの種類] で、 [任意の組織のディレクトリ内のアカウント] を選択します。

  7. [登録] を選択して、アプリケーションを作成します。

  8. アプリの [概要] ページで、 [アプリケーション (クライアント) ID] の値を探し、後で使用するために記録します。 このプロジェクトの YAML 構成ファイルを構成するために必要です。

  9. [管理] で、[API の公開] を選択>スコープを追加します。 api://{clientId} を選択して、提案されたアプリケーション ID URI () を受け入れ、次の情報を入力します。

    • [スコープ名] に「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を有効にする

次に、Spring Cloud Azure で REST API 保護を有効にします。

セキュリティの依存関係を追加する

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>7.4.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    手記

    Spring Boot 4.0.x を使用している場合は、 spring-cloud-azure-dependencies バージョンを 7.4.0 に設定します。

    Spring Boot 3.5.x を使用している場合は、 spring-cloud-azure-dependencies バージョンを 6.5.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> ファイルの セクションに設定する必要があります。 これにより、すべての Spring Cloud Azure依存関係で同じバージョンが使用されるようになります。

    この BOM に使用されるバージョンの詳細については、「どのバージョンの Spring Cloud Azure を使用すべきか」を参照してください。

  • Spring Cloud Azure Starter Microsoft Entraアーティファクト:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    
  • Spring Boot Starter OAuth2 リソース サーバーアーティファクト:

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

手記

v1.0 トークンでは、構成には API のクライアント ID が必要ですが、v2.0 トークンでは、要求でクライアント ID またはアプリケーション ID URI を使用できます。 両方を構成して、対象ユーザーの検証を適切に完了できます。

Azure Spring Appsにデプロイする

Spring Boot アプリケーションをローカルで実行したら、運用環境に移動できます。 Azure Spring Apps を使用すると、コードを変更することなく、Spring Boot アプリケーションをAzureに簡単にデプロイできます。 このサービスは、開発者が自分のコードに集中できるように、Spring アプリケーションのインフラストラクチャを管理します。 Azure Spring Appsでは、包括的な監視と診断、構成管理、サービス検出、CI/CD 統合、ブルーグリーンデプロイなどを使用したライフサイクル管理が提供されます。 詳細については、「Quickstart: deploy your first application to Azure Spring Apps」を参照してください。

次の手順