グループとグループ要求を使用して Java Spring Boot アプリをセキュリティで保護する
この記事では、認証、承認、トークンの取得に Java 用 Microsoft Entra ID Spring Boot Starter クライアント ライブラリを使用する Java Spring Boot web アプリについて説明します。 このアプリでは、OpenID Connect プロトコルを使用してユーザーのサインインを行い、Microsoft Entra ID セキュリティ グループのメンバーシップに応じてページへのアクセスを制限します。
次の図は、アプリのトポロジを示しています。
クライアント アプリは、Java 用 Microsoft Entra ID Spring Boot Starter クライアント ライブラリを使用して Microsoft Entra ID テナントでユーザーのサインインを行い、ID トークンを Microsoft Entra ID から 取得します。
ID トークンにはグループ要求が含まれます。 その要求が、サインインしているユーザーの Spring GrantedAuthorities
リストに読み込まれます。 これらの値により、ユーザーにどのページへのアクセスを許可するかが判断されます。
このシナリオを紹介するビデオ、「アプリ ロール、セキュリティ グループ、スコープ、ディレクトリ ロールを使用した承認をアプリケーションに実装する」をご覧ください。
前提条件
- JDK バージョン 15。 このサンプルは Java 15 のシステムで開発されましたが、他のバージョンとも互換性があります。
- Maven 3
- Visual Studio Code でこのサンプルを実行する場合は、Visual Studio Code 向け Java 拡張機能パックをお勧めします。
- Microsoft Entra ID テナント。 詳細については、クイックスタート: テナントの設定を参照してください。
- 自分の Microsoft Entra ID テナントのユーザー アカウント。 このサンプルは、個人の Microsoft アカウントでは正しく動作しません。 したがって、個人のアカウントを使用して Azure portal にサインインしたものの、ディレクトリにユーザー アカウントがない場合は、この時点で作成する必要があります。
- 2 つのセキュリティ グループ (
AdminGroup
とUserGroup
) に、サインインとこのサンプルのテストを行うユーザーを含めます。 または、テナント内の 2 つの既存のセキュリティ グループにユーザーを追加します。 既存のグループを使用する場合は、既存のセキュリティ グループの名前とオブジェクト ID を使用するように、サンプルの構成を変更する必要があります。 - Visual Studio Code
- Visual Studio Code 用 Azure ツール
推奨事項
- Spring Framework に関するある程度の知識。
- Linux/OSX ターミナルに関するある程度の知識。
- トークンの検査に必要な jwt.ms。
- ネットワークの活動監視とトラブルシューティングに必要な Fiddler。
- 開発に関する最新の情報について、Microsoft Entra ID ブログを確認してください。
サンプルのセットアップ
次のセクションでは、サンプル アプリケーションを設定する方法を示します。
サンプル リポジトリを複製またはダウンロードする
サンプルを複製するには、Bash ウィンドウを開き、次のコマンドを使用します。
git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 4-spring-web-app/3-Authorization-II/groups
または、ms-identity-msal-java-samples リポジトリに移動し、.zip ファイルでダウンロードして、ハード ドライブに展開します。
重要
Windows でファイル パスの長さが制限を超える場合は、ハード ドライブのルート近くのディレクトリにリポジトリを複製または展開してください。
Microsoft Entra ID テナントにサンプル アプリケーションを登録する
このサンプルには、プロジェクトが 1 つ存在します。 以下の各セクションでは、Azure portal を使用してアプリを登録する方法を説明します。
アプリケーションを作成する Microsoft Entra ID テナントを選択する
テナントを選択するには、次の手順に従います。
Azure portal にサインインします。
ご利用のアカウントが複数の Microsoft Entra ID テナントに存在する場合は、Azure portal の隅にあるプロファイルを選択し、ディレクトリの切り替えを選択して、セッションを目的の Microsoft Entra ID テナントに変更します。
アプリを登録する (java-spring-webapp-groups)
アプリを登録するには、次の手順に従います。
Azure portal に移動し、Microsoft Entra ID を選択します。
ナビゲーション ペインでアプリの登録を選択し、新しい登録を選択します。
表示される アプリケーションの登録ページで、アプリケーションの登録情報を入力します。
- 名前セクションに、アプリのユーザーに表示されるわかりやすいアプリケーション名を入力します (例:
java-spring-webapp-groups
)。 - [サポートされているアカウントの種類] で、 [この組織のディレクトリ内のアカウントのみ] を選択します。
- [リダイレクト URI (省略可能)] セクションで、コンボボックスの [Web] を選択し、リダイレクト URI 「
http://localhost:8080/login/oauth2/code/
」を入力します。
- 名前セクションに、アプリのユーザーに表示されるわかりやすいアプリケーション名を入力します (例:
[登録] を選択して、アプリケーションを作成します。
アプリの登録ページで、アプリケーション (クライアント) ID の値を見つけてメモします。 この値は、後ほどアプリの構成ファイルで使用します。
アプリの登録ページで、ナビゲーション ペインにある 証明書とシークレットを選択してページを開き、シークレットの生成と証明書のアップロードを行います。
[クライアント シークレット] セクションで、 [新しいクライアント シークレット] を選択します。
キーの説明 (例: アプリのシークレット) を入力します。
選択可能な期間: 6 か月、12 か月、またはカスタムからいずれかを選択します。
[追加] を選択します。 生成された値が表示されます。
生成した値をコピーしてから保存します。 この値は後ほど、コードの構成ファイルに使用します。 この値は二度と表示されず、他の方法でも取得はできません。 そのため、必ず Azure portal から保存した後に、他の画面やペインに移動してください。
アプリの登録ページで、ナビゲーション ペインから API のアクセス許可を選択してページを開き、アプリケーションで必要となる API へのアクセス許可を追加します。
[アクセス許可の追加] を選択します。
[Microsoft API] タブが選択されていることを確認します。
[よく使用される Microsoft API] セクションで、 [Microsoft Graph] を選択します。
委任されたアクセス許可セクションで、一覧から GroupMember.Read.All を選択します。 必要に応じて検索ボックスを使用します。 このアクセス許可は、超過のシナリオが発生した場合、Graph を介してグループ メンバーシップを取得するため必要です。
GroupMember.Read.All
に管理の同意を与えるボタンを選択します。[アクセス許可の追加] を選択します.
セキュリティ グループを作成する
セキュリティ グループを作成するには、次の手順のようにします。
Azure portal に移動し、Microsoft Entra ID を選択します。
ナビゲーション ウィンドウでグループを選択します。
グループ ペインで新しいグループを選択し、次の情報を入力します。
- グループの種類で、セキュリティを選択します
- グループ名に AdminGroup と入力します。
- グループの説明に管理セキュリティ グループと入力します。
- このサンプルで使用し、テストを行うグループ所有者とグループ メンバーを追加します。
- [作成] を選択します
グループ ペインで新しいグループを選択し、次の情報を入力します。
- グループの種類で、セキュリティを選択します
- グループ名前 に、UserGroup と入力します。
- グループの説明にユーザー セキュリティ グルーと入力します。
- このサンプルで使用し、テストを行うグループ所有者とグループ メンバーを追加します。
- [作成] を選択します
詳細については、「Microsoft Entraグループとグループ メンバシップの管理」を参照してください。
セキュリティ グループを構成する
アプリケーションでグループ要求をどのように受け取るかを細かく設定するための方法として、次の選択肢があります。
Microsoft Entra ID テナントにサインイン済みのユーザーが割り当てられているすべてのグループ (入れ子になったグループを含む) を受け取ります。 詳細については、「サインイン済みのユーザーが割り当てられているすべてのグループ (入れ子になったグループを含む) を受け取るようアプリケーションを構成する」を参照してください。
アプリケーションで対象グループとしてプログラムされた、フィルター処理されたグループのセットからグループ要求の値を受け取ります。 詳細については、「ユーザーが割り当てられる可能性のある、フィルター処理されたグループのセットからグループ要求の値を受け取るようアプリケーションを構成する」を参照してください。 この選択肢は、Microsoft Entra ID Free エディション では使用できません。
Note
グループ ID ではなく、オンプレミス グループの samAccountName
または On Premises Group Security Identifier
を使用する場合は、「Microsoft Entra ID を使ってアプリケーションに対するグループ要求を構成する」の「Active Directory から同期されたグループ属性を使用する場合の前提条件」を参照してください。
サインイン済みのユーザーが割り当てられているすべてのグループ (入れ子になったグループを含む) を受け取るようアプリケーションを構成する
アプリを構成するには、次の手順に従います。
アプリの登録ページで、ナビゲーション ペインにあるトークンの構成を選択してページを開き、アプリケーションにトークンが発行されることで可能になる要求を構成します。
グループ要求の追加を選択して、グループ要求の編集画面を開きます。
セキュリティ グループまたはすべてのグループ (配布リストを含むが、アプリケーションに割り当てられているグループは含まない) を選択します。 両方を選択すると、セキュリティ グループ オプションが無効になります。
ID セクションで、グループ ID を選択します。 Microsoft Entra ID が、ユーザーのサインイン後にアプリが受け取る ID トークンのグループ要求で、ユーザーが割り当てられているグループのオブジェクト ID を送信します。
ユーザーが割り当てられる可能性のある、フィルター処理されたグループのセットからグループ要求の値を受け取るようアプリケーションを構成する
このオプションは、次のような場合に使用します。
- アプリケーションが、サインインしているユーザーが割り当てられる可能性のあるグループを選択したセットに対して処理を行う。
- アプリが、このユーザーがテナントで割り当てられているすべてのセキュリティ グループに対して処理を行うわけではない。
このオプションを使用すると、アプリケーションの使用量超過の問題を防げます。
この選択肢をアプリで有効にするには、次の手順を使います。
アプリの登録ページで、ナビゲーション ペインにあるトークンの構成を選択してページを開き、アプリケーションにトークンが発行されることで可能になる要求を構成します。
グループ要求の追加を選択して、グループ要求の編集画面を開きます。
アプリケーションに割り当てられているグループを選択し、他のオプションは選択しません。 セキュリティ グループやすべてのグループ (配布リストを含むが、アプリケーションに割り当てられているグループは含まない) など、その他のオプションを選択した場合、これらのオプションは、アプリケーションに割り当てられたグループの効果を否定します。
ID セクションで、グループ ID を選択します。 Microsoft Entra ID が、ユーザーのサインイン後にアプリが受け取る ID トークンのグループ要求で、ユーザーが割り当てられているグループのオブジェクト ID を送信します。
API の公開オプションを使用して Web API を公開している場合、アクセスセクションのグループ ID オプションを選択することもできます。 これを選択すると、API のクライアント アプリケーションに発行されたアクセス トークンのグループ要求に、ユーザーが割り当てられているグループのオブジェクト ID が、Microsoft Entra ID によって送信されます。
アプリの登録ページで、ナビゲーション ペインにある概要を選択して、アプリケーションの概要画面を開きます。
ローカル ディレクトリでのマネージド アプリケーションで、アプリケーションの名前が表示されたハイパーリンクを選択します。 このフィールド タイトルは マネージド アプリケーション ... のように切り取られる場合があります。このリンクを選択すると、アプリケーションを作成したテナント内のアプリケーションのサービス プリンシパルに関連付けられているエンタープライズ アプリケーションの概要ページが表示されます。 ブラウザーの [戻る] ボタンを使用して、アプリの登録ページに戻ることができます。
ナビゲーション ペインでユーザーとグループを選択してページを開き、ユーザーとグループをアプリケーションに割り当てます。
ユーザーの追加を選択します。
結果画面からユーザーとグループを選択します。
このアプリケーションに割り当てるグループを選択します。
選択を選択して、グループの選択を完了します。
割り当てを選択して、グループの割り当て操作を完了します。
以上の手順で、アプリにサインインするユーザーが、これらの割り当てられたグループの 1 つ以上のメンバーである場合、アプリケーションはグループ要求で選択されたグループを受け取ることができます。
ナビゲーション ペインでプロパティを選択して、アプリケーションの基本プロパティを一覧表示するページを開きます。 ユーザーの割り当てが必要のフラグを はいにセットします。
重要
ユーザーの割り当てが必要をはいに設定すると、ユーザーとグループ ペインでアプリケーションに割り当てられたユーザーのみがアプリにサインインできていることを Microsoft Entra ID がチェックします。 ユーザーは直接割り当てることも、所属するセキュリティ グループを割り当てることもできます。
アプリの登録とセキュリティ グループ (java-spring-webapp-groups) を使用するようにコード サンプルを構成する
アプリを構成するには、次の手順に従います。
Note
以降の手順では、ClientID
は Application ID
または AppId
と同じです。
IDE でプロジェクトを開きます。
src\main\resources\application.yml ファイルを開きます。
プレースフォルダー
Enter_Your_Tenant_ID_Here
を見つけて、既存の値を Microsoft Entra テナント ID に置き換えます。Enter_Your_Client_ID_Here
のプレースフォルダーを見つけて、既存の値をアプリケーション ID または Azure portal からコピーしたjava-spring-webapp-groups
アプリのclientId
に変更します。Enter_Your_Client_Secret_Here
のプレースフォルダーを見つけて、既存の値を Azure portal からコピーした、java-spring-webapp-groups
の作成時に保存した値に置き換えます。プレースホルダー
Enter_Your_Admin_Group_ID_Here
を見つけて、既存の値を AdminGroup のobjectId
の値に変更します。プレースホルダー
Enter_Your_User_Group_ID_Here
を見つけて、既存の値を UserGroup のobjectId
の値に変更します。src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/SampleController.java ファイルを開きます。
プレースホルダー
Enter_Your_Admin_Group_ID_Here
を見つけて、既存の値を AdminGroup のobjectId
の値に変更します。プレースホルダー
Enter_Your_User_Group_ID_Here
を見つけて、既存の値を UserGroup のobjectId
の値に変更します。
サンプルを実行する
以降のセクションでは、サンプルを Azure Container Apps にデプロイする方法を紹介します。
前提条件
- Azure アカウント。 アカウントがない場合は、 無料アカウントを作成してください。 続行するには、Azure サブスクリプションの "共同作成者" または "所有者" のアクセス許可が必要です。 詳細については、Azure portal を使用して Azure ロールを割り当てる方法に関するページを参照してください。
- Azure CLI。
- Azure Container Apps CLI 拡張機能バージョン
0.3.47
以上。 最新バージョンをインストールするには、az extension add --name containerapp --upgrade --allow-preview
コマンドを使用します。 - Java Development Kit バージョン 17 以上。
- Maven。
Spring プロジェクトを準備する
次の手順を実行して、プロジェクトを準備します。
次の Maven コマンドを使用して、プロジェクトをビルドします。
mvn clean verify
次のコマンドを使用して、サンプル プロジェクトをローカルで実行します。
mvn spring-boot:run
セットアップ
CLI から Azure にサインインするには、次のコマンドを実行し、プロンプトに従って認証プロセスを完了します。
az login
最新バージョンの CLI を実行していることを確認するには、upgrade コマンドを実行します。
az upgrade
次に、CLI 用の Azure Container Apps 拡張機能をインストールまたは更新します。
Azure CLI で az containerapp
コマンドを実行するときにパラメーターが見つからないというエラーが表示された場合には、最新バージョンの Azure Container Apps 拡張機能がインストールされていることを確認してください。
az extension add --name containerapp --upgrade
Note
2024 年 5 月以降、Azure CLI 拡張機能では、既定でプレビュー機能が有効になりません。 Container Apps のプレビュー機能にアクセスするには、--allow-preview true
を使用して Container Apps 拡張機能をインストールします。
az extension add --name containerapp --upgrade --allow-preview true
最新の拡張機能またはモジュールがインストールされたので、Microsoft.App
および Microsoft.OperationalInsights
名前空間を登録します。
Note
Azure Container Apps リソースは、Microsoft.Web
名前空間から Microsoft.App
名前空間に移行されました。 詳細については、「2022 年 3 月に Microsoft.Web から Microsoft.App に名前空間を移行する」を参照してください。
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
Azure Container Apps 環境を作成する
Azure CLI のセットアップが完了したところで、この記事全体で使用される環境変数を定義できます。
bash シェルで次の変数を定義します。
export RESOURCE_GROUP="ms-identity-containerapps"
export LOCATION="canadacentral"
export ENVIRONMENT="env-ms-identity-containerapps"
export API_NAME="ms-identity-api"
export JAR_FILE_PATH_AND_NAME="./target/ms-identity-spring-boot-webapp-0.0.1-SNAPSHOT.jar"
リソース グループを作成する。
az group create \
--name $RESOURCE_GROUP \
--location $LOCATION \
自動生成されたログ分析ワークスペースを使用して環境を作成します。
az containerapp env create \
--name $ENVIRONMENT \
--resource-group $RESOURCE_GROUP \
--location $LOCATION
コンテナー アプリ環境の既定のドメインを表示します。 このドメインは、後のセクションで使用するためにメモしておきます。
az containerapp env show \
--name $ENVIRONMENT \
--resource-group $RESOURCE_GROUP \
--query properties.defaultDomain
アプリのデプロイを準備する
アプリケーションを Azure Container Apps にデプロイすると、リダイレクト URL は、Azure Container Apps にデプロイされたアプリ インスタンスのリダイレクト URL に変更されます。 application.yml ファイルでこれらの設定を変更するには、次の手順に従います。
アプリの src\main\resources\application.yml ファイルに移動し、
post-logout-redirect-uri
の値をデプロイされたアプリのドメイン名に変更します (次の例を参照)。<API_NAME>
と<default-domain-of-container-app-environment>
は実際の値に置き換えてください。 たとえば、前の手順の Azure Container Apps 環境の既定のドメインを使用し、アプリ名にms-identity-api
を使用する場合、post-logout-redirect-uri
値にはhttps://ms-identity-api.<default-domain>
を使用します。post-logout-redirect-uri: https://<API_NAME>.<default-domain-of-container-app-environment>
このファイルを保存した後、次のコマンドを使用してアプリをリビルドします。
mvn clean package
重要
アプリケーションの application.yml ファイルには、クライアント シークレットの値が client-secret
パラメーターに格納されています。 この値をこのファイルに保持しないでください。 また、ファイルを Git リポジトリにコミットすると、リスクが生じる可能性があります。 推奨される方法については、「Azure Container Apps でシークレットを管理する」を参照してください。
Microsoft Entra IDアプリの登録を更新する
リダイレクト URI は Azure Container Apps にデプロイされたアプリに変更されるため、Microsoft Entra ID アプリの登録でも、リダイレクト URI を変更する必要があります。 次の手順に従って、この変更を行います。
開発者用の Microsoft ID プラットフォームの [アプリの登録] ページに移動します。
検索ボックスを使用してアプリの登録を検索します (例:
java-servlet-webapp-authentication
)。名前を選択して、アプリの登録を開きます。
コマンドメニューから 認証 を選択します。
Web - リダイレクト URI セクションで、URI の追加を選択します。
アプリの URI を、
/login/oauth2/code/
を追加して入力します。たとえばhttps://<containerapp-name>.<default domain of container app environment>/login/oauth2/code/
のようになります。[保存] を選択します。
アプリケーションのデプロイ
JAR パッケージを Azure Container Apps にデプロイします。
Note
必要に応じて、Java ビルド環境変数で JDK のバージョンを指定できます。 詳細については、Azure Container Apps の Java 用ビルド環境変数に関する記事を参照してください。
これで、az containerapp up
CLI コマンドを使って WAR ファイルをデプロイできるようになります。
az containerapp up \
--name $API_NAME \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--environment $ENVIRONMENT \
--artifact <JAR_FILE_PATH_AND_NAME> \
--ingress external \
--target-port 8080 \
--query properties.configuration.ingress.fqdn
Note
既定の JDK バージョンは 17 です。 アプリケーションとの互換性のために JDK のバージョンを変更する必要がある場合は、--build-env-vars BP_JVM_VERSION=<YOUR_JDK_VERSION>
引数を使ってバージョン番号を調整できます。
ビルド環境変数の詳細については、Azure Container Apps の Java 用ビルド環境変数に関する記事を参照してください。
アプリを検証する
この例では、containerapp up
コマンドに --query properties.configuration.ingress.fqdn
引数が含まれており、完全修飾ドメイン名 (FQDN) (アプリの URL とも呼ばれます) を返します。 次の手順を使用して、アプリのログをチェックし、デプロイの問題があれば調査します。
デプロイメント セクションの出力ページから出力アプリケーションの URL にアクセスします。
Azure Container Apps インスタンスの[概要] ページのナビゲーション ウィンドウで、[ログ] を選択してアプリのログを確認します。
サンプルの確認
次の手順に従ってサンプルを操作します。
- サインインまたはサインアウトの状態が、画面の中央に表示されます。
- 画面の隅にある状況依存ボタンを選択します。 このボタンは、アプリを最初に実行するときにサインインと表示します。 または、トークンの詳細、管理者のみ、通常のユーザーのいずれかを選択します。 これらのページは保護されており、認証が必要であるため、サインイン ページに自動でリダイレクトされます。
- 次のページに記載された指示に従い、Microsoft Entra ID テナントのアカウントでサインインします。
- 同意画面に、必要となるスコープが表示されます。
- サインイン フローが正常に完了するとホーム ページにリダイレクトされ、どのボタンでサインイン フローをトリガーした化に応じて、サインインの状態ページまたは他のいずれかのページが表示されます。
- 状況依存ボタンの表示がサインアウトに変わり、ユーザー名が表示されます。
- ホーム ページを表示している場合は、IDトークンの詳細を選択して、IDトークンのデコードされた要求 (グループなど) の一部を表示します。
- 管理のみを選択して
/admin_only
を表示します。 このページを表示できるのは、AdminGroup
のセキュリティ グループに属しているユーザーだけです。 それ以外のユーザーには、承認エラー メッセージが表示されます。 - 通常のユーザーを選択し、
/regular_user
ページを表示します。 このページを表示できるのは、UserGroup
のセキュリティ グループに属しているユーザーだけです。 それ以外のユーザーには、承認エラー メッセージが表示されます。 - 隅にあるボタンを使用してサインアウトします。新しい状態が状態ページに反映されます。
コードについて
このサンプルでは、Java 用 Microsoft Entra ID Spring Boot Starter クライアント ライブラリを使用して Microsoft Entra ID テナントへのユーザーのサインインを行う方法を説明します。 このサンプルでは、Spring Oauth2 クライアントと Spring Web ブート スターターも使用します。 このサンプルでは、Microsoft Entra ID から取得した ID トークンの要求を使用して、サインインしているユーザーの詳細を表示し、グループ要求を承認に使用して一部のページへのアクセス制限を行います。
Contents
次の表に、サンプル プロジェクト フォルダーの内容を示します。
ファイル/フォルダー | 説明 |
---|---|
pom.xml | アプリケーションの依存関係。 |
src/main/resources/templates/ | UI 用の Thymeleaf テンプレート。 |
src/main/resources/application.yml | アプリケーションと Microsoft Entra ID Boot Starter ライブラリの構成。 |
src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ | このディレクトリには、メイン アプリケーションのエントリ ポイント、コントローラー、および構成のクラスが含まれています。 |
.../MsIdentitySpringBootWebappApplication.java | Main クラス。 |
.../SampleController.java | エンドポイントをマッピングするコントローラー。 |
.../SecurityConfig.java | セキュリティ構成 - たとえば、認証が必要なルートを構成します。 |
.../Utilities.java | ユーティリティ クラス - たとえば、ID トークン要求をフィルター処理します。 |
CHANGELOG.md | サンプルに対する変更の一覧。 |
CONTRIBUTING.md | サンプルに貢献するためのガイドライン。 |
ライセンス | サンプルのライセンス。 |
ID トークン要求
アプリはトークンの詳細を抽出するために、要求マッピングで Spring Security の AuthenticationPrincipal
と OidcUser
のオブジェクトを使用します (次の例を参照)。 このアプリで ID トークン要求を使用する方法については、サンプル コントローラーを参照してください。
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
//...
@GetMapping(path = "/some_path")
public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
Map<String, Object> claims = principal.getIdToken().getClaims();
}
ID トークンのグループ要求を処理する
トークンのグループ要求には、サインインしているユーザーが割り当てられているグループの名前が含まれます (次の例を参照)。
{
...
"groups": [
"xyz-id-xyz",
"xyz-id-xyz",]
...
}
グループ名にアクセスする一般的な方法については、「ID トークン要求」セクションに説明があります。
Microsoft Entra ID Boot Starter v3.5 以降では、グループ要求が自動的に解析され、サインインしているユーザーの Authorities
に各グループが追加されます。 そのため、開発時に Spring PrePost
の条件注釈で hasAuthority
メソッドを使用して、グループを使用できます。 たとえば、次の @PreAuthorize
は、SampleController.java で説明した条件です。
@GetMapping(path = "/admin_only")
@PreAuthorize("hasAuthority('enter-admin-group-id-here')")
public String adminOnly(Model model) {
// restrict to users who belong to AdminGroup
}
@GetMapping(path = "/regular_user")
@PreAuthorize("hasAnyAuthority('enter-user-group-id-here','enter-admin-group-id-here')")
public String regularUser(Model model) {
// restrict to users who belong to any of UserGroup or AdminGroup
}
次のコードにより、指定したユーザーのすべての権限のリストが取得されます。
@GetMapping(path = "/some_path")
public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
Collection<? extends GrantedAuthority> authorities = principal.getAuthorities();
}
サインインとサインアウトのリンク
アプリはサインインを行う際に、Java 用 Microsoft Entra ID Spring Boot Starter クライアント ライブラリで自動的に構成された Microsoft Entra ID サインイン エンドポイントに対して要求を行います (次の例を参照)。
<a class="btn btn-success" href="/oauth2/authorization/azure">Sign In</a>
アプリはサインアウトを行う際に、logout
エンドポイントへの POST 要求を行います (次の例を参照)。
<form action="#" th:action="@{/logout}" method="post">
<input class="btn btn-warning" type="submit" value="Sign Out" />
</form>
認証に依存する UI 要素
アプリの UI テンプレート ページに、ユーザーが認証済みかどうかに応じて表示するコンテンツを決定するためのシンプルなロジックがあります (Spring Security Thymeleaf タグを使用した次の例を参照)。
<div sec:authorize="isAuthenticated()">
this content only shows to authenticated users
</div>
<div sec:authorize="isAnonymous()">
this content only shows to not-authenticated users
</div>
AADWebSecurityConfigurerAdapter を使用してルートを保護する
既定では、ID トークンの詳細、管理者のみ、および通常のユーザーページのみが保護され、サインインしているユーザーのみがそれらのページにアクセスできます。 アプリは、application.yml ファイルにある app.protect.authenticated
プロパティを使用して、これらのルートを構成します。 アプリの特定の要件を構成するには、いずれのクラスで AADWebSecurityConfigurationAdapter
を拡張します。 例については、このアプリの SecurityConfig クラスを参照してください (次の例を参照)。
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends AADWebSecurityConfigurerAdapter{
@Value( "${app.protect.authenticated}" )
private String[] protectedRoutes;
@Override
public void configure(HttpSecurity http) throws Exception {
// use required configuration form AADWebSecurityAdapter.configure:
super.configure(http);
// add custom configuration:
http.authorizeRequests()
.antMatchers(protectedRoutes).authenticated() // limit these pages to authenticated users (default: /token_details, /admin_only, /regular_user)
.antMatchers("/**").permitAll(); // allow all other routes.
}
}
グループの超過処理要求
トークンのサイズが HTTP ヘッダー サイズの上限を超えないよう、Microsoft ID プラットフォームでは、グループ要求に含まれるオブジェクト ID の数が制限されます。
超過制限は、SAML トークンの場合は 150、JWT トークンの場合は 200、シングルページ アプリケーションの場合は 6 です。 ユーザーが超過の制限より多い数のグループのメンバーである場合、Microsoft ID プラットフォームは、トークン内のグループ要求のグループ ID を出力しません。 代わりに、Microsoft Graph API に照会してユーザーのグループ メンバーシップを取得するようアプリケーションに指示する超過要求がトークンに追加されます。
Microsoft Entra ID Boot Starter v3.5 以降では、グループ要求が自動的に解析され、サインインしているユーザーの Authorities
に各グループが追加されます。 スターターは、グループの超過のシナリオを自動で処理します。
Note
グループの超過分が発生しないように、可能であればグループ フィルター機能を使用することを強くお勧めします。 詳細については、「ユーザーが割り当てられる可能性のある、フィルター処理されたグループのセットからグループ要求の値を受け取るようアプリケーションを構成する」を参照してください。
テスト用の超過のシナリオを作成する
作成するグループの数が多く、それらをユーザーを割り当てる場合は、AppCreationScripts フォルダーにある BulkCreateGroups.ps1 ファイルを使用します。 このファイルを使用しては、開発中の超過シナリオをテストできます。 BulkCreateGroups.ps1 スクリプトにあるユーザーの objectId
を変更することを忘れないでください。
超過の処理には、サインインしているユーザーのグループ メンバーシップを読み取るために、Microsoft Graph を呼び出す必要があるため、getMemberGroups 関数を実行するために User.Read と GroupMember.Read.Allのアクセス許可が必要です。
重要
超過のシナリオでは、クライアント アプリとサービス アプリの両方に、Microsoft Graph API の GroupMember.Read.All
スコープに対して Admin Consent
が付与されている必要があります。 詳細については、この記事の前半にあるアプリの登録の手順を参照してください。
Microsoft Entra ID アプリの登録を更新する (java-spring-webapp-groups)
Web アプリの登録を更新するには、次の手順を使用します。
Azure ポータルに戻ります。
ナビゲーション ウィンドウで、Azure Active Directory を選択し、アプリの登録 (プレビュー) を選択します。
結果の画面で、
java-spring-webapp-groups
アプリケーションを選択します。アプリの登録ページで、メニューから認証を選択します。
リダイレクト URI セクションで、Azure デプロイのサイト URL と一致するように応答 URL を更新します (例:
https://java-spring-webapp-groups.azurewebsites.net/login/oauth2/code/
)。
重要
アプリがメモリ内ストレージを使用している場合、Azure アプリ Services は非アクティブな場合に Web サイトをスピンダウンし、アプリが保持していたレコードは空になります。 また、Web サイトのインスタンス数を増やすと、要求がインスタンス間で分散されます。 したがって、アプリのレコードは各インスタンスで同じではありません。
詳細
- Microsoft ID プラットフォームのドキュメント
- Microsoft Authentication Library (MSAL) の概要
- クイック スタート: Microsoft ID プラットフォームにアプリケーションを登録する
- クイック スタート: Web API にアクセスするようにクライアント アプリケーションを構成する
- Microsoft Entra ID アプリケーションの同意エクスペリエンスについて理解する
- ユーザーおよび管理者の同意について
- Azure Active Directory のアプリケーション オブジェクトとサービス プリンシパル オブジェクト
- 各国のクラウド
- MSAL コードのサンプル
このシナリオおよびその他のシナリオでの OAuth 2.0 プロトコルの動作の詳細については、「Microsoft Entra ID の認証シナリオ」を参照してください。