Keycloak 認可
概要
Red Hat build of Quarkus ドキュメントへのフィードバックの提供 リンクのコピーリンクがクリップボードにコピーされました!
エラーを報告したり、ドキュメントを改善したりするには、Red Hat Jira アカウントにログインし、課題を送信してください。Red Hat Jira アカウントをお持ちでない場合は、アカウントを作成するように求められます。
手順
- 次のリンクをクリックして チケットを作成します。
- Summary に課題の簡単な説明を入力します。
- Description に課題や機能拡張の詳細な説明を入力します。問題があるドキュメントのセクションへの URL も記載してください。
- Submit をクリックすると、課題が作成され、適切なドキュメントチームに転送されます。
第1章 OpenID Connect (OIDC) と Keycloak を使用して認証を一元化する リンクのコピーリンクがクリップボードにコピーされました!
保護されたリソースへ安全にアクセスできるように、Keycloak Authorization Services を使用して Quarkus アプリケーションでベアラートークン認可を有効にする方法を説明します。
1.1. 概要 リンクのコピーリンクがクリップボードにコピーされました!
Keycloak Authorization エクステンション (quarkus-keycloak-authorization) は、OpenID Connect エクステンション (quarkus-oidc) を拡張して、高度な認可機能を提供します。保護されたリソースへのアクセスを動的に管理するポリシーエンフォーサーを備えています。アクセスは Keycloak で定義された権限によって管理され、柔軟で動的なリソースベースのアクセス制御 (RBAC) をサポートします。
Keycloak を使用しており、認可決定を処理するために環境で Keycloak Authorization Services が有効になっている場合にのみ、quarkus-keycloak-authorization エクステンションを使用します。
Keycloak を使用していない場合、または Keycloak が Keycloak Authorization Services なしで設定されている場合は、代わりに quarkus-oidc エクステンションを使用します。
仕組み
quarkus-keycloak-authorization エクステンションは、Keycloak の認可責任を一元化し、セキュリティーを強化して、アプリケーションのメンテナンスを簡素化します。
-
ベアラートークンを検証するために
quarkus-oidcエクステンションを使用します。 - 検証されたトークンを Keycloak Authorization Services に送信します。
- これにより、Keycloak はリソース名、識別子、URI などの属性を使用して、リソースベースの権限を動的に評価できるようになります。
認可決定を外部化することで、次のことが可能になります。
- アプリケーションコードを変更せずに、多様なアクセス制御ストラテジーを実装できます。
- セキュリティー要件が進化するにつれ、再デプロイの必要性を軽減できます。
互換性
このエクステンションは、Quarkus OIDC サービスアプリケーション とのみ互換性があります。ロールベースのアクセス制御などの明示的なメカニズムを動的認可ポリシーで補完します。
主な特長
- 集中管理: アプリケーション間で一貫したセキュリティーポリシーを実現するために、認可の決定を Keycloak に委譲します。
- 動的権限: リソース属性を使用してアクセス制御を動的に定義します。
- メンテナンスの簡素化: アクセスポリシーが変更されたときにアプリケーションを更新して再デプロイする必要性を軽減します。
セットアップ
このエクステンションを使用する前に、次の点を確認してください。
- Keycloak インスタンスで Keycloak Authorization Services が有効化されている。
-
Quarkus アプリケーションに
quarkus-keycloak-authorizationエクステンションが含まれている。
詳細な手順は、OIDC ベアラートークン認証 ガイドを参照してください。
関連情報
Keycloak Authorization Services とポリシーエンフォーサーの詳細は、公式ドキュメント Keycloak Authorization Services ドキュメント を参照してください。
1.2. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
このガイドを完了するには、以下が必要です。
- 約 15 分
- IDE
-
JAVA_HOMEが適切に設定された状態でインストールされた JDK 17 以降 - Apache Maven 3.8.6 以降
- 動作するコンテナーランタイム (Docker または Podman)
- オプション: Quarkus CLI (使用する場合)
- オプション: ネイティブ実行可能ファイルをビルドする場合は、インストールおよび 適切に設定された Mandrel または GraalVM (ネイティブコンテナービルドを使用する場合は Docker)。
- jq tool
- Keycloak
1.3. アーキテクチャー リンクのコピーリンクがクリップボードにコピーされました!
この例では、2 つの保護されたエンドポイントを持つ単純なマイクロサービスのセットアップを示します。
-
/api/users/me -
/api/admin
トークンベースのアクセス制御
これらのエンドポイントへのアクセスは、ベアラートークンを使用して制御されます。アクセスするには、次の条件を満たす必要があります。
- 有効なトークン: トークンには正しい署名、適切な有効期限、適切な対象者が設定されている必要があります。
- 信頼: マイクロサービスは発行元の Keycloak サーバーを信頼する必要があります。
Keycloak サーバーによって発行されるベアラートークンは、以下の役割を果たします。
- ユーザー識別子: トークンが発行された対象 (ユーザー) を示します。
- クライアント参照: OAuth 2.0 Authorization Server 標準に従って、ユーザーに代わって動作するクライアントアプリケーションを識別します。
エンドポイントとアクセスポリシー
/api/users/me の場合:
-
アクセスポリシー: 有効なベアラートークンと
userロールを持つユーザーに適用されます。 レスポンス: トークンから派生した JSON オブジェクトとしてユーザーの詳細を返します。
応答の例
{ "user": { "id": "1234", "username": "johndoe", "email": "johndoe@example.com" } }
/api/admin の場合:
-
アクセスポリシー: 有効なベアラートークンと
adminロールを持つユーザーに制限されます。
分離された認可
この例では、リソースを保護するためのロールベースアクセス制御 (RBAC) ポリシーの使用を説明します。主なポイントは次のとおりです。
- ポリシーの柔軟性: Keycloak は、属性ベースやカスタムポリシーなど、さまざまなポリシータイプをサポートしており、きめ細かい制御が可能となります。
- 分離されたアプリケーションロジック: 認可ポリシーは Keycloak によって完全に管理されるため、アプリケーションはコア機能に集中できます。
1.4. ソリューション リンクのコピーリンクがクリップボードにコピーされました!
次のセクションの指示に従って、アプリケーションを段階的に作成することを推奨します。ただし、完成した例に直接進むこともできます。
Git リポジトリーのクローンを作成するか (git clone https://github.com/quarkusio/quarkus-quickstarts.git -b 3.20)、アーカイブ をダウンロードしてください。
このソリューションは security-keycloak-authorization-quickstart ディレクトリー にあります。
1.5. プロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
最初に、次のコマンドを使用して新しいプロジェクトを作成します。
Quarkus CLI を使用する場合:
quarkus create app org.acme:security-keycloak-authorization-quickstart \ --extension='oidc,keycloak-authorization,rest-jackson' \ --no-code cd security-keycloak-authorization-quickstartGradle プロジェクトを作成するには、
--gradleオプションまたは--gradle-kotlin-dslオプションを追加します。Quarkus CLI のインストール方法と使用方法の詳細は、Quarkus CLI ガイドを参照してください。
Maven を使用する場合:
mvn com.redhat.quarkus.platform:quarkus-maven-plugin:3.20.1:create \ -DprojectGroupId=org.acme \ -DprojectArtifactId=security-keycloak-authorization-quickstart \ -Dextensions='oidc,keycloak-authorization,rest-jackson' \ -DnoCode cd security-keycloak-authorization-quickstartGradle プロジェクトを作成するには、
-DbuildTool=gradleまたは-DbuildTool=gradle-kotlin-dslオプションを追加します。
Windows ユーザーの場合:
-
cmd を使用する場合は、バックスラッシュ
\を使用せず、すべてを同じ行に記述してください。 -
Powershell を使用している場合は、二重引用符で wrap
-Dパラメーターを囲みます (例:"-DprojectArtifactId=security-keycloak-authorization-quickstart")
このコマンドは、keycloak-authorization エクステンションを備えた新しいプロジェクトを生成します。このエクステンションは、Keycloak Adapter を Quarkus アプリケーションに統合し、Keycloak サーバーと対話してベアラートークンの認可を実行するために必要な機能を提供します。
既存のプロジェクトにエクステンションを追加する
既存の Quarkus プロジェクトがある場合は、プロジェクトのベースディレクトリーで次のコマンドを実行して、oidc および keycloak-authorization エクステンションを追加できます。
Quarkus CLI を使用する場合:
quarkus extension add oidc,keycloak-authorizationMaven を使用する場合:
./mvnw quarkus:add-extension -Dextensions='oidc,keycloak-authorization'Gradle を使用する場合:
./gradlew addExtension --extensions='oidc,keycloak-authorization'
このコマンドは、ビルドファイルに以下の依存関係を追加します。
Maven を使用する場合:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-oidc</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-keycloak-authorization</artifactId> </dependency>Gradle を使用する場合:
implementation("io.quarkus:quarkus-oidc") implementation("io.quarkus:quarkus-keycloak-authorization")
/api/users/me エンドポイントの実装
最初に /api/users/me エンドポイントを実装します。次のコードは、ユーザーの詳細を提供する Jakarta REST リソースを定義します。
package org.acme.security.keycloak.authorization;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import org.jboss.resteasy.reactive.NoCache;
import io.quarkus.security.identity.SecurityIdentity;
@Path("/api/users")
public class UsersResource {
@Inject
SecurityIdentity identity;
@GET
@Path("/me")
@NoCache
public User me() {
return new User(identity);
}
public static class User {
private final String userName;
User(SecurityIdentity identity) {
this.userName = identity.getPrincipal().getName();
}
public String getUserName() {
return userName;
}
}
}
/api/admin エンドポイントの実装
次に、/api/admin エンドポイントを定義します。次のコードは、認証で保護された単純な Jakarta REST リソースを表しています。
package org.acme.security.keycloak.authorization;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import io.quarkus.security.Authenticated;
@Path("/api/admin")
@Authenticated
public class AdminResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String admin() {
return "granted";
}
}
Keycloak によるロールベースのアクセス制御
リソースへのアクセス制御を強制するために @RolesAllowed などの明示的なアノテーションが定義されていないことに注意してください。代わりに、keycloak-authorization エクステンションは、Keycloak 内の保護されたリソースの URI を動的にマッピングします。
アクセス制御は次のように管理されます。
- Keycloak は、設定されたポリシーに基づいて各リクエストの権限を評価します。
- エクステンションはこれらの権限を適用し、Keycloak で定義されたロールまたはポリシーに基づいてアクセスを許可または拒否します。
これにより、アクセス制御ロジックがアプリケーションコードから分離され、Keycloak で直接アクセスポリシーを管理および更新しやすくなります。
1.6. アプリケーションの設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenID Connect エクステンションを使用すると、通常は src/main/resources ディレクトリーにある application.properties ファイルを通じてアダプター設定を行うことができます。以下に例を示します。以下に例を示します。
# OIDC Configuration
%prod.quarkus.oidc.auth-server-url=https://localhost:8543/realms/quarkus
quarkus.oidc.client-id=backend-service
quarkus.oidc.credentials.secret=secret
quarkus.oidc.tls.verification=none
# Enable Policy Enforcement
quarkus.keycloak.policy-enforcer.enable=true
# Import the realm file with Dev Services for Keycloak
# Note: This property is effective only in dev mode, not in JVM or native modes
quarkus.keycloak.devservices.realm-path=quarkus-realm.json
- 1
- Keycloak サーバーの URL と認証に使用するレルムを指定します。
- 2
- Keycloak レルム内のクライアントアプリケーションを識別します。
- 3
- Keycloak サーバーによる認証用のクライアントシークレットを定義します。
- 4
- 開発目的で TLS 検証を無効にします。実稼働環境では推奨されません。
- 5
- Keycloak ポリシーエンフォーサーが、定義された権限に基づいてアクセス制御を管理できるようにします。
- 6
- 指定されたレルムファイルをインポートするように Dev Services を設定します。これは開発モードでのみ有効で、JVM モードやネイティブモードでは有効ではありません。
quarkus.oidc.auth-server-url に %prod. プロファイル接頭辞を追加すると、Dev Services for Keycloak がコンテナーを開発モードで自動的に起動するようになります。詳細は、開発モードでのアプリケーションの実行 セクションを参照してください。
デフォルトでは、quarkus-oidc エクステンションを使用するアプリケーションは、service タイプのアプリケーションとして扱われます。ただし、エクステンションは次の条件下で web-app タイプのアプリケーションもサポートします。
-
認可コード付与フロー中に返されるアクセストークンは、ロールのソース (
quarkus.oidc.roles.source=accesstoken) である必要があります。 -
注記:
web-appタイプのアプリケーションの場合、ID トークンのロールはデフォルトでチェックされます。
1.7. Keycloak サーバーの起動と設定 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションを開発モードで実行する場合は、Keycloak サーバーを起動しないでください。Dev Services for Keycloak がコンテナーを起動します。詳細は、開発モードでのアプリケーションの実行 セクションを参照してください。
Keycloak サーバーを起動するには、以下の Docker コマンドを使用します。
docker run --name keycloak \
-e KC_BOOTSTRAP_ADMIN_USERNAME=admin \
-e KC_BOOTSTRAP_ADMIN_PASSWORD=admin \
-p 8543:8443 \
-v "$(pwd)"/config/keycloak-keystore.jks:/etc/keycloak-keystore.jks \
quay.io/keycloak/keycloak:{keycloak.version} \
start --hostname-strict=false --https-key-store-file=/etc/keycloak-keystore.jks
- 1
keycloak.versionの場合、バージョンが26.1.3以降であることを確認してください。- 2
- Keycloak キーストアの場合は、quarkus-quickstarts/security-keycloak-authorization-quickstart/config にある
keycloak-keystore.jksファイルを使用します。
Keycloak サーバーへのアクセス
- ブラウザーを開き、https://localhost:8543 に移動します。
次の認証情報を使用して、Keycloak Administration Console にログインします。
-
ユーザー名:
admin -
パスワード:
admin
-
ユーザー名:
レルム設定のインポート
新しいレルムを作成するには、レルム設定ファイル をインポートします。レルムを作成する詳細な手順は、Keycloak のドキュメント Create a new realm を参照してください。
レルムをインポートした後、リソースの権限を確認できます。
リソース権限における Keycloak のロール
リソースのアクセス権限は Keycloak で直接設定されるため、アプリケーションコードに @RolesAllowed アノテーションを付ける必要がなくなります。このアプローチにより、Keycloak 内でアクセス制御管理が集中化され、アプリケーションのメンテナンスとセキュリティー更新が簡素化されます。
1.8. 開発モードでのアプリケーションの実行 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションを開発モードで実行するには、次のコマンドを使用します。
Quarkus CLI を使用する場合:
quarkus devMaven を使用する場合:
./mvnw quarkus:devGradle を使用する場合:
./gradlew --console=plain quarkusDev
Dev Services for Keycloak は、Keycloak コンテナーを起動し、quarkus-realm.json 設定ファイルをインポートします。
/q/dev-ui で利用可能な Dev UI を開き、Dev UI の OpenID Connect カードの Provider: Keycloak リンクをクリックします。
ユーザー権限のテスト
OpenID Connect Dev UI によって提供される Single Page Application にログインするように求められたら、次の手順を実行します。
/api/users/meリソースにアクセスするためのUser Permissionのみを持つalice(パスワード:alice) としてログインします。-
/api/adminにアクセスすると、403が返されます。 -
/api/users/meにアクセスすると、200が返されます。
-
ログアウトし、
adminとしてログインします (パスワード:admin)。admin は、/api/adminリソースにアクセスするためのAdmin Permissionと、/api/users/meリソースにアクセスするためのUser Permissionの両方を持っています。-
/api/adminにアクセスすると、200が返されます。 -
/api/users/meにアクセスすると、200が返されます。
-
Keycloak レルムのカスタマイズ
quarkus-realm.json などのレルムファイルをインポートせずに Dev Services for Keycloak を開始した場合は、Keycloak 認可ポリシーなしでデフォルトの quarkus レルムを作成します。
- Dev UI の OpenID Connect カードから Keycloak Admin リンクを選択します。
-
Keycloak 管理コンソールにログインします。ユーザー名とパスワードは両方とも
adminです。 -
quarkusレルムで認可ポリシーを有効にするには、Keycloak Authorization Services ドキュメント の指示に従ってください。
Keycloak Admin リンクは、Dev UI で簡単に見つけることができます。
カスタム JavaScript ポリシーの追加
アプリケーションが JAR ファイルにデプロイされた JavaScript ポリシー で設定された Keycloak 認可を使用する場合、Dev Services for Keycloak はこのアーカイブを Keycloak コンテナーに転送できます。転送を設定するには、application.properties の次のプロパティーを使用します。
# Alias the policies archive
quarkus.keycloak.devservices.resource-aliases.policies=/policies.jar
# Map the policies archive to a specific location in the container
quarkus.keycloak.devservices.resource-mappings.policies=/opt/keycloak/providers/policies.jar
1.9. JVM モードでのアプリケーションの実行 リンクのコピーリンクがクリップボードにコピーされました!
開発モードでアプリケーションを試した後、JVM モードで標準の Java アプリケーションとして実行できます。
アプリケーションをコンパイルします。
Quarkus CLI を使用する場合:
quarkus buildMaven を使用する場合:
./mvnw installGradle を使用する場合:
./gradlew build
アプリケーションを実行します。
java -jar target/quarkus-app/quarkus-run.jar
1.10. ネイティブモードでアプリケーションの実行 リンクのコピーリンクがクリップボードにコピーされました!
このデモはネイティブコードにコンパイルできます。変更は必要ありません。
ネイティブコンパイルでは、生成されたバイナリーにランタイムが含まれ、リソースの使用が最小限になるように最適化されるため、実稼働環境で JVM が不要になります。
コンパイルには長い時間がかかるため、デフォルトでは無効になっています。アプリケーションをビルドするには、native プロファイルを有効にします。
ネイティブバイナリーをビルドします。
Quarkus CLI を使用する場合:
quarkus build --nativeMaven を使用する場合:
./mvnw install -DnativeGradle を使用する場合:
./gradlew build -Dquarkus.native.enabled=true
しばらくしたら、ネイティブバイナリーを実行します。
./target/security-keycloak-authorization-quickstart-runner
1.11. アプリケーションのテスト リンクのコピーリンクがクリップボードにコピーされました!
開発モードでアプリケーションをテストする手順は、前述の 開発モードでのアプリケーションの実行 セクションを参照してください。
curl を使用して、JVM またはネイティブモードで実行されているアプリケーションをテストできます。
アクセストークンの取得
アプリケーションはベアラートークン認可を使用します。リソースにアクセスするには、まず Keycloak サーバーからアクセストークンを取得します。
export access_token=$(\
curl --insecure -X POST https://localhost:8543/realms/quarkus/protocol/openid-connect/token \
--user backend-service:secret \
-H 'content-type: application/x-www-form-urlencoded' \
-d 'username=alice&password=alice&grant_type=password' | jq --raw-output '.access_token' \
)
quarkus.oidc.authentication.user-info-required プロパティーが true に設定されている場合、アプリケーションで UserInfo をリクエストするにはアクセストークンの使用が必須となります。その場合、トークン付与リクエストに scope=openid クエリーパラメーターを追加する必要があります。以下に例を示します。
export access_token=$(\
curl --insecure -X POST http://localhost:8180/realms/quarkus/protocol/openid-connect/token \
--user backend-service:secret \
-H 'content-type: application/x-www-form-urlencoded' \
-d 'username=alice&password=alice&grant_type=password&scope=openid' | jq --raw-output '.access_token' \
)
上記の例では、ユーザー alice のアクセストークンを取得します。
/api/users/me エンドポイントへのアクセス
有効なアクセストークンを持つすべてのユーザーは、ユーザーの詳細を含む JSON ペイロードを返す http://localhost:8080/api/users/me エンドポイントにアクセスできます。
curl -v -X GET \
http://localhost:8080/api/users/me \
-H "Authorization: Bearer "$access_token
/api/admin エンドポイントへのアクセス
http://localhost:8080/api/admin エンドポイントは、admin ロールを持つユーザーに制限されています。以前発行されたアクセストークンを使用してこのエンドポイントにアクセスしようとすると、サーバーは 403 Forbidden 応答を返します。
curl -v -X GET \
http://localhost:8080/api/admin \
-H "Authorization: Bearer "$access_token
管理者アクセストークンの取得
管理エンドポイントにアクセスするには、admin ユーザーのアクセストークンを取得します。
export access_token=$(\
curl --insecure -X POST https://localhost:8543/realms/quarkus/protocol/openid-connect/token \
--user backend-service:secret \
-H 'content-type: application/x-www-form-urlencoded' \
-d 'username=admin&password=admin&grant_type=password' | jq --raw-output '.access_token' \
)
1.12. 認可クライアントの注入 リンクのコピーリンクがクリップボードにコピーされました!
Keycloak Authorization Client Java API を使用すると、リソースの管理や Keycloak からの直接権限の取得などの高度なタスクを実行できます。この機能を有効にするには、AuthzClient インスタンスを Bean に注入します。
public class ProtectedResource {
@Inject
AuthzClient authzClient;
}
AuthzClient を直接使用する場合は、quarkus.keycloak.policy-enforcer.enable=true を設定します。それ以外の場合は、インジェクションに Bean を使用できません。
AuthzClient を直接使用するには、quarkus.keycloak.policy-enforcer.enable=true を設定します。設定されていない場合、注入に使用できる Bean はありません。
1.13. 保護されたリソースのマッピング リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、エクステンションは URI を使用して保護が必要なアプリケーションリソースを識別し、マッピングすることで、オンデマンドで Keycloak からリソースを取得します。
オンデマンドによる取得を無効にし、代わりに起動時にリソースを事前ロードするには、以下のプロパティーを設定します。
quarkus.keycloak.policy-enforcer.lazy-load-paths=false
起動時に Keycloak からリソースを事前ロードするのに必要な時間はリソースの数によって異なり、アプリケーションの初期ロード時間に影響する可能性があります。
1.14. 保護されたリソースの設定に関する詳細 リンクのコピーリンクがクリップボードにコピーされました!
デフォルト設定では、Keycloak はロールを管理し、誰がどのルートにアクセスできるかを決定します。
@RolesAllowed アノテーションまたは application.properties ファイルを使用して保護されたルートを設定するには、OpenID Connect (OIDC) ベアラートークンの認証 および Web エンドポイントの認可 ガイドを確認してください。詳細は、Quarkus Security の概要 を参照してください。
1.15. パブリックリソースへのアクセス リンクのコピーリンクがクリップボードにコピーされました!
quarkus-keycloak-authorization ポリシーを適用せずにパブリックリソースへのアクセスを許可するには、application.properties ファイルで permit HTTP ポリシーを定義します。詳細は、Web エンドポイントの認可 ガイドを参照してください。
次のような設定を使用する場合、Keycloak Authorization Policy のポリシーチェックを無効にする必要はありません。
quarkus.keycloak.policy-enforcer.paths.1.paths=/api/public
quarkus.keycloak.policy-enforcer.paths.1.enforcement-mode=DISABLED
匿名ユーザーによるパブリックリソースへのアクセスを制限するには、強制的な Keycloak Authorization Policy を定義します。
quarkus.keycloak.policy-enforcer.paths.1.paths=/api/public-enforcing
quarkus.keycloak.policy-enforcer.paths.1.enforcement-mode=ENFORCING
パブリックリソースへの匿名アクセスを制御する必要がある場合、デフォルトのテナント設定のみが適用されます。
1.16. プログラムを使用して権限スコープを確認する リンクのコピーリンクがクリップボードにコピーされました!
リソース権限に加えて、メソッドスコープを定義できます。スコープは通常、リソースに対して実行されるアクションを表します。メソッドスコープを使用して、Keycloak Authorization Policy を強制する設定を作成できます。以下に例を示します。
# path policy with enforced scope 'read' for method 'GET'
quarkus.keycloak.policy-enforcer.paths.1.name=Scope Permission Resource
quarkus.keycloak.policy-enforcer.paths.1.paths=/api/protected/standard-way
quarkus.keycloak.policy-enforcer.paths.1.methods.get.method=GET
quarkus.keycloak.policy-enforcer.paths.1.methods.get.scopes=read
# path policies without scope
quarkus.keycloak.policy-enforcer.paths.2.name=Scope Permission Resource
quarkus.keycloak.policy-enforcer.paths.2.paths=/api/protected/programmatic-way,/api/protected/annotation-way
- 1
- ユーザーは、リソース権限
Scope Permission Resourceおよびreadスコープを持っている必要があります。
Keycloak Policy Enforcer は /api/protected/standard-way リクエストパスを保護し、@RolesAllowed などのアノテーションの必要性を排除します。ただし、シナリオによっては、プログラムによるチェックを実行する必要がある場合があります。
これは、以下の例のように SecurityIdentity インスタンスを Bean に注入することで実現できます。または、@PermissionsAllowed でリソースメソッドにアノテーションを付けると、同じ結果を得られます。以下の例は、3 つのリソースメソッドを示しており、それぞれに同じ read スコープが必要です。
import java.security.BasicPermission;
import java.util.List;
import jakarta.inject.Inject;
import jakarta.ws.rs.ForbiddenException;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import org.keycloak.representations.idm.authorization.Permission;
import io.quarkus.security.PermissionsAllowed;
import io.quarkus.security.identity.SecurityIdentity;
import io.smallrye.mutiny.Uni;
@Path("/api/protected")
public class ProtectedResource {
@Inject
SecurityIdentity identity;
@GET
@Path("/standard-way")
public Uni<List<Permission>> standardWay() {
return Uni.createFrom().item(identity.<List<Permission>> getAttribute("permissions"));
}
@GET
@Path("/programmatic-way")
public Uni<List<Permission>> programmaticWay() {
var requiredPermission = new BasicPermission("Scope Permission Resource") {
@Override
public String getActions() {
return "read";
}
};
return identity.checkPermission(requiredPermission).onItem()
.transform(granted -> {
if (granted) {
return identity.getAttribute("permissions");
}
throw new ForbiddenException();
});
}
@PermissionsAllowed("Scope Permission Resource:read")
@GET
@Path("/annotation-way")
public Uni<List<Permission>> annotationWay() {
return Uni.createFrom().item(identity.<List<Permission>> getAttribute("permissions"));
}
}
- 1
/standard-wayサブパスには、application.propertiesファイルで設定された設定に基づいて、リソース権限とreadスコープの両方が必要です。- 2
/programmatic-wayサブパスは、デフォルトではScope Permission Resource権限のみをチェックします。ただし、SecurityIdentity#checkPermissionを使用すると、スコープ要件などの追加の制約を適用できます。- 3
/annotation-wayの@PermissionsAllowedアノテーションは、readスコープとともにScope Permission Resource権限を持つリクエストへのアクセスを制限します。詳細は、セキュリティー認可ガイドの アノテーションを使用した認可 セクションを参照してください。
1.17. マルチテナンシー リンクのコピーリンクがクリップボードにコピーされました!
OpenID Connect (OIDC) マルチテナンシー の処理方法と同様に、テナントごとにポリシーエンフォーサー設定をセットアップできます。以下に例を示します。
quarkus.keycloak.policy-enforcer.enable=true
# Default Tenant
quarkus.oidc.auth-server-url=${keycloak.url:replaced-by-test-resource}/realms/quarkus
quarkus.oidc.client-id=quarkus-app
quarkus.oidc.credentials.secret=secret
quarkus.keycloak.policy-enforcer.enforcement-mode=PERMISSIVE
quarkus.keycloak.policy-enforcer.paths.1.name=Permission Resource
quarkus.keycloak.policy-enforcer.paths.1.paths=/api/permission
quarkus.keycloak.policy-enforcer.paths.1.claim-information-point.claims.static-claim=static-claim
# Service Tenant
quarkus.oidc.service-tenant.auth-server-url=${keycloak.url:replaced-by-test-resource}/realms/quarkus
quarkus.oidc.service-tenant.client-id=quarkus-app
quarkus.oidc.service-tenant.credentials.secret=secret
quarkus.keycloak.service-tenant.policy-enforcer.enforcement-mode=PERMISSIVE
quarkus.keycloak.service-tenant.policy-enforcer.paths.1.name=Permission Resource Service
quarkus.keycloak.service-tenant.policy-enforcer.paths.1.paths=/api/permission
quarkus.keycloak.service-tenant.policy-enforcer.paths.1.claim-information-point.claims.static-claim=static-claim
# WebApp Tenant
quarkus.oidc.webapp-tenant.auth-server-url=${keycloak.url:replaced-by-test-resource}/realms/quarkus
quarkus.oidc.webapp-tenant.client-id=quarkus-app
quarkus.oidc.webapp-tenant.credentials.secret=secret
quarkus.oidc.webapp-tenant.application-type=web-app
quarkus.oidc.webapp-tenant.roles.source=accesstoken
quarkus.keycloak.webapp-tenant.policy-enforcer.enforcement-mode=PERMISSIVE
quarkus.keycloak.webapp-tenant.policy-enforcer.paths.1.name=Permission Resource WebApp
quarkus.keycloak.webapp-tenant.policy-enforcer.paths.1.paths=/api/permission
quarkus.keycloak.webapp-tenant.policy-enforcer.paths.1.claim-information-point.claims.static-claim=static-claim
1.18. 動的なテナント設定の解決 リンクのコピーリンクがクリップボードにコピーされました!
設定ファイル内の過剰なエントリーを避けながら複数のテナントの設定を作成するには、io.quarkus.keycloak.pep.TenantPolicyConfigResolver インターフェイスを使用して、実行時にプログラムで定義することができます。
package org.acme.security.keycloak.authorization;
import java.util.Map;
import jakarta.enterprise.context.ApplicationScoped;
import io.quarkus.keycloak.pep.TenantPolicyConfigResolver;
import io.quarkus.keycloak.pep.runtime.KeycloakPolicyEnforcerConfig;
import io.quarkus.keycloak.pep.runtime.KeycloakPolicyEnforcerTenantConfig;
import io.quarkus.oidc.OidcRequestContext;
import io.quarkus.oidc.OidcTenantConfig;
import io.smallrye.mutiny.Uni;
import io.vertx.ext.web.RoutingContext;
@ApplicationScoped
public class CustomTenantPolicyConfigResolver implements TenantPolicyConfigResolver {
private final KeycloakPolicyEnforcerTenantConfig enhancedTenantConfig;
private final KeycloakPolicyEnforcerTenantConfig newTenantConfig;
public CustomTenantPolicyConfigResolver(KeycloakPolicyEnforcerConfig enforcerConfig) {
this.enhancedTenantConfig = KeycloakPolicyEnforcerTenantConfig.builder(config)
.paths("/enhanced-config")
.permissionName("Permission Name")
.get("read-scope")
.build();
this.newTenantConfig = KeycloakPolicyEnforcerTenantConfig.builder()
.paths("/new-config")
.claimInformationPoint(Map.of("claims", Map.of("grant", "{request.parameter['grant']}")))
.build();
}
@Override
public Uni<KeycloakPolicyEnforcerTenantConfig> resolve(RoutingContext routingContext, OidcTenantConfig tenantConfig,
OidcRequestContext<KeycloakPolicyEnforcerTenantConfig> requestContext) {
String path = routingContext.normalizedPath();
String tenantId = tenantConfig.tenantId.orElse(null);
if ("enhanced-config-tenant".equals(tenantId) && path.equals("/enhanced-config")) {
return Uni.createFrom().item(enhancedTenantConfig);
} else if ("new-config-tenant".equals(tenantId) && path.equals("/new-config")) {
return Uni.createFrom().item(newTenantConfig);
}
return Uni.createFrom().nullItem();
}
}
1.19. 設定の参照 リンクのコピーリンクがクリップボードにコピーされました!
この設定は、公式ガイドラインの Keycloak Policy Enforcer Configuration に準拠しています。さまざまな設定オプションの詳細は、次のドキュメントを参照してください。
🔒 ビルド時に固定: 設定プロパティーはビルド時に固定されます。他のすべての設定プロパティーは実行時にオーバーライドできます。
| 設定プロパティー | 型 | デフォルト |
|
🔒 ビルド時に修正 ポリシーの強制を有効化します。
環境変数: | boolean |
|
|
アダプターは、Keycloak サーバーへの個別の HTTP 呼び出しを行い、アクセスコードをアクセストークンに変換します。この設定オプションは、Keycloak サーバーへの接続をいくつプールするか定義します。
環境変数: | int |
|
|
ポリシーの強制方法を指定します。
環境変数: |
|
|
|
キャッシュに保持される必要があるエントリーの制限を定義します。
環境変数: | int |
|
|
エントリーの期限が切れる時間 (ミリ秒単位) を定義します。
環境変数: | long |
|
|
アプリケーションがパスに関連付けられたリソースのサーバーを取得する方法を指定します。true の場合、ポリシーエンフォーサーは要求されるパスに応じてオンデマンドでリソースを取得します。
環境変数: | boolean |
|
|
複雑な設定。
環境変数: | Map<String,Map<String,Map<String,String>>> | |
|
単純な設定。
環境変数: | Map<String,Map<String,String>> | |
|
スコープを HTTP メソッドにマッピングする方法を指定します。true に設定すると、ポリシーエンフォーサーは現在のリクエストから HTTP メソッドを使用して、アクセス権を付与すべきか確認します。
環境変数: | boolean |
|
|
指定のパスに関連付けられるサーバー上のリソースの名前。
環境変数: | string | |
|
ポリシーエンフォーサーによって保護される必要がある HTTP 要求パス
環境変数: | list of string | |
|
HTTP メソッドの名前。
環境変数: | string | 必須 ⚠️ 必須 |
|
メソッドに関連付けられたスコープを持つ文字列の配列。
環境変数: | list of string | 必須 ⚠️ 必須 |
|
メソッドに関連付けられたスコープの強制モードを参照する文字列。
環境変数: |
|
|
|
ポリシーの強制方法を指定します。
環境変数: |
|
|
|
複雑な設定。
環境変数: | Map<String,Map<String,Map<String,String>>> | |
|
単純な設定。
環境変数: | Map<String,Map<String,String>> | |
| 型 | デフォルト | |
|
アダプターは、Keycloak サーバーへの個別の HTTP 呼び出しを行い、アクセスコードをアクセストークンに変換します。この設定オプションは、Keycloak サーバーへの接続をいくつプールするか定義します。
環境変数: | int |
|
|
ポリシーの強制方法を指定します。
環境変数: |
|
|
|
指定のパスに関連付けられるサーバー上のリソースの名前。
環境変数: | string | |
|
ポリシーエンフォーサーによって保護される必要がある HTTP 要求パス
環境変数: | list of string | |
|
HTTP メソッドの名前。
環境変数: | string | 必須 ⚠️ 必須 |
|
メソッドに関連付けられたスコープを持つ文字列の配列。
環境変数: | list of string | 必須 ⚠️ 必須 |
|
メソッドに関連付けられたスコープの強制モードを参照する文字列。
環境変数: |
|
|
|
ポリシーの強制方法を指定します。
環境変数: |
|
|
|
複雑な設定。
環境変数: | Map<String,Map<String,Map<String,String>>> | |
|
単純な設定。
環境変数: | Map<String,Map<String,String>> | |
|
キャッシュに保持される必要があるエントリーの制限を定義します。
環境変数: | int |
|
|
エントリーの期限が切れる時間 (ミリ秒単位) を定義します。
環境変数: | long |
|
|
アプリケーションがパスに関連付けられたリソースのサーバーを取得する方法を指定します。true の場合、ポリシーエンフォーサーは要求されるパスに応じてオンデマンドでリソースを取得します。
環境変数: | boolean |
|
|
複雑な設定。
環境変数: | Map<String,Map<String,Map<String,String>>> | |
|
単純な設定。
環境変数: | Map<String,Map<String,String>> | |
|
スコープを HTTP メソッドにマッピングする方法を指定します。true に設定すると、ポリシーエンフォーサーは現在のリクエストから HTTP メソッドを使用して、アクセス権を付与すべきか確認します。
環境変数: | boolean |
|