Keycloak 認可


Red Hat build of Quarkus 3.27

Red Hat Customer Content Services

概要

このガイドでは、安全なポリシー設定、動的なリソースアクセス管理、および外部アイデンティティープロバイダーの統合に重点を置き、Keycloak の高度な認可機能を詳しく説明します。また、最新のアプリケーション環境において、ロールベースおよび属性ベースのアクセス制御メカニズムを実装し、微調整するための包括的な手順も提供します。

第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 に委譲します。
  • 動的権限: リソース属性を使用してアクセス制御を動的に定義します。
  • メンテナンスの簡素化: アクセスポリシーが変更されたときにアプリケーションを更新して再デプロイする必要性を軽減します。

セットアップ

このエクステンションを使用する前に、次の点を確認してください。

  1. Keycloak インスタンスで Keycloak Authorization Services 機能が有効になっています。
  2. 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"
      }
    }
    Copy to Clipboard Toggle word wrap

/api/admin の場合:

  • アクセスポリシー: 有効なベアラートークンと admin ロールを持つユーザーに制限されます。

分離された認可

この例では、リソースを保護するためのロールベースアクセス制御 (RBAC) ポリシーの使用を説明します。主なポイントは次のとおりです。

  • ポリシーの柔軟性: Keycloak は、属性ベースやカスタムポリシーなど、さまざまなポリシータイプをサポートしており、きめ細かい制御が可能となります。
  • 分離されたアプリケーションロジック: 認可ポリシーは Keycloak によって完全に管理されるため、アプリケーションはコア機能に集中できます。

1.4. 解決方法

次のセクションの指示に従って、アプリケーションを段階的に作成することを推奨します。ただし、完成した例に直接進むこともできます。

Git リポジトリーのクローンを作成するか (git clone https://github.com/quarkusio/quarkus-quickstarts.git -b 3.27)、アーカイブ をダウンロードしてください。

このソリューションは 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-quickstart
    Copy to Clipboard Toggle word wrap

    Gradle プロジェクトを作成するには、--gradle オプションまたは --gradle-kotlin-dsl オプションを追加します。

    Quarkus CLI のインストール方法と使用方法の詳細は、Quarkus CLI ガイドを参照してください。

  • Maven を使用する場合:

    mvn com.redhat.quarkus.platform:quarkus-maven-plugin:3.27.1:create \
        -DprojectGroupId=org.acme \
        -DprojectArtifactId=security-keycloak-authorization-quickstart \
        -Dextensions='oidc,keycloak-authorization,rest-jackson' \
        -DnoCode
    cd security-keycloak-authorization-quickstart
    Copy to Clipboard Toggle word wrap

    Gradle プロジェクトを作成するには、-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-authorization
    Copy to Clipboard Toggle word wrap
  • Maven を使用する場合:

    ./mvnw quarkus:add-extension -Dextensions='oidc,keycloak-authorization'
    Copy to Clipboard Toggle word wrap
  • Gradle を使用する場合:

    ./gradlew addExtension --extensions='oidc,keycloak-authorization'
    Copy to Clipboard Toggle word wrap

このコマンドは、ビルドファイルに以下の依存関係を追加します。

  • Maven を使用する場合:

    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-oidc</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-keycloak-authorization</artifactId>
    </dependency>
    Copy to Clipboard Toggle word wrap
  • Gradle を使用する場合:

    implementation("io.quarkus:quarkus-oidc")
    implementation("io.quarkus:quarkus-keycloak-authorization")
    Copy to Clipboard Toggle word wrap

/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;
        }
    }
}
Copy to Clipboard Toggle word wrap

/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";
    }
}
Copy to Clipboard Toggle word wrap

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 
1

quarkus.oidc.client-id=backend-service 
2

quarkus.oidc.credentials.secret=secret 
3

quarkus.oidc.tls.verification=none 
4


# Enable Policy Enforcement
quarkus.keycloak.policy-enforcer.enable=true 
5


# 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 
6
Copy to Clipboard Toggle word wrap
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} \ 
1

  start --hostname-strict=false --https-key-store-file=/etc/keycloak-keystore.jks 
2
Copy to Clipboard Toggle word wrap
1
keycloak.version の場合、バージョンが 26.3.0 以降であることを確認してください。
2
Keycloak キーストアの場合は、quarkus-quickstarts/security-keycloak-authorization-quickstart/config にある keycloak-keystore.jks ファイルを使用します。

Keycloak サーバーへのアクセス

  1. ブラウザーを開き、https://localhost:8543 に移動します。
  2. 次の認証情報を使用して、Keycloak Administration Console にログインします。

    • ユーザー名: admin
    • パスワード: admin

レルム設定のインポート

新しいレルムを作成するには、レルム設定ファイル をインポートします。レルムを作成する詳細な手順は、Keycloak のドキュメント Create a new realm を参照してください。

レルムをインポートした後、Clients に移動して backend-service クライアントを選択し、このクライアントの Authorization and Resources タブを選択します。リソースの権限を確認できるようになりました。

リソース権限における Keycloak のロール

リソースのアクセス権限は Keycloak で直接設定されるため、アプリケーションコードに @RolesAllowed アノテーションを付ける必要がなくなります。このアプローチにより、Keycloak 内でアクセス制御管理が集中化され、アプリケーションのメンテナンスとセキュリティー更新が簡素化されます。

1.8. 開発モードでのアプリケーションの実行

アプリケーションを開発モードで実行するには、次のコマンドを使用します。

  • Quarkus CLI を使用する場合:

    quarkus dev
    Copy to Clipboard Toggle word wrap
  • Maven を使用する場合:

    ./mvnw quarkus:dev
    Copy to Clipboard Toggle word wrap
  • Gradle を使用する場合:

    ./gradlew --console=plain quarkusDev
    Copy to Clipboard Toggle word wrap

Dev Services for Keycloak は、Keycloak コンテナーを起動し、quarkus-realm.json 設定ファイルをインポートします。

/q/dev-ui で利用可能な Dev UI を開き、Dev UI の OpenID Connect カードの Provider: Keycloak リンクをクリックします。

開発 UI の操作

  1. /q/dev-uiDev UI を開きます。
  2. Dev UI の OpenID Connect カード内の Provider: Keycloak リンクをクリックします。

ユーザー権限のテスト

OpenID Connect Dev UI によって提供される Single Page Application にログインするように求められたら、次の手順を実行します。

  1. /api/users/me リソースにアクセスするための User Permission のみを持つ alice (パスワード: alice) としてログインします。

    1. /api/admin にアクセスすると、403 が返されます。
    2. /api/users/me にアクセスすると、200 が返されます。
  2. ログアウトし、admin としてログインします (パスワード: admin)。admin は、/api/admin リソースにアクセスするための Admin Permission と、/api/users/me リソースにアクセスするための User Permission の両方を持っています。

    1. /api/admin にアクセスすると、200 が返されます。
    2. /api/users/me にアクセスすると、200 が返されます。

Keycloak レルムのカスタマイズ

quarkus-realm.json などのレルムファイルをインポートせずに Dev Services for Keycloak を開始した場合は、Keycloak 認可ポリシーなしでデフォルトの quarkus レルムを作成します。

  1. Dev UI の OpenID Connect カードから Keycloak Admin リンクを選択します。
  2. Keycloak 管理コンソールにログインします。ユーザー名とパスワードは両方とも admin です。
  3. 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 
1

# Map the policies archive to a specific location in the container
quarkus.keycloak.devservices.resource-mappings.policies=/opt/keycloak/providers/policies.jar 
2
Copy to Clipboard Toggle word wrap
1
/policies.jar クラスパスリソースの policies エイリアスを作成します。ポリシーアーカイブはファイルシステム上にも配置できます。
2
ポリシーアーカイブを Keycloak コンテナー内の /opt/keycloak/providers/policies.jar のロケーションにマップします。

1.9. JVM モードでのアプリケーションの実行

開発モードでアプリケーションを試した後、JVM モードで標準の Java アプリケーションとして実行できます。

アプリケーションをコンパイルします。

  • Quarkus CLI を使用する場合:

    quarkus build
    Copy to Clipboard Toggle word wrap
  • Maven を使用する場合:

    ./mvnw install
    Copy to Clipboard Toggle word wrap
  • Gradle を使用する場合:

    ./gradlew build
    Copy to Clipboard Toggle word wrap

アプリケーションを実行します。

java -jar target/quarkus-app/quarkus-run.jar
Copy to Clipboard Toggle word wrap

1.10. ネイティブモードでアプリケーションの実行

このデモはネイティブコードにコンパイルできます。変更は必要ありません。

ネイティブコンパイルでは、生成されたバイナリーにランタイムが含まれ、リソースの使用が最小限になるように最適化されるため、実稼働環境で JVM が不要になります。

コンパイルには長い時間がかかるため、デフォルトでは無効になっています。アプリケーションをビルドするには、native プロファイルを有効にします。

ネイティブバイナリーをビルドします。

  • Quarkus CLI を使用する場合:

    quarkus build --native
    Copy to Clipboard Toggle word wrap
  • Maven を使用する場合:

    ./mvnw install -Dnative
    Copy to Clipboard Toggle word wrap
  • Gradle を使用する場合:

    ./gradlew build -Dquarkus.native.enabled=true
    Copy to Clipboard Toggle word wrap

しばらくしたら、ネイティブバイナリーを実行します。

./target/security-keycloak-authorization-quickstart-1.0.0-SNAPSHOT-runner
Copy to Clipboard Toggle word wrap

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' \
 )
Copy to Clipboard Toggle word wrap
注記

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' \
 )
Copy to Clipboard Toggle word wrap

上記の例では、ユーザー 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
Copy to Clipboard Toggle word wrap

/api/admin エンドポイントへのアクセス

http://localhost:8080/api/admin エンドポイントは、admin ロールを持つユーザーに制限されています。以前発行されたアクセストークンを使用してこのエンドポイントにアクセスしようとすると、サーバーは 403 Forbidden 応答を返します。

curl -v -X GET \
  http://localhost:8080/api/admin \
  -H "Authorization: Bearer "$access_token
Copy to Clipboard Toggle word wrap

管理者アクセストークンの取得

管理エンドポイントにアクセスするには、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' \
 )
Copy to Clipboard Toggle word wrap

1.12. 認可クライアントの注入

Keycloak Authorization Client Java API を使用すると、リソースの管理や Keycloak からの直接権限の取得などの高度なタスクを実行できます。この機能を有効にするには、AuthzClient インスタンスを Bean に注入します。

public class ProtectedResource {
    @Inject
    AuthzClient authzClient;
}
Copy to Clipboard Toggle word wrap
注記

AuthzClient を直接使用するには、quarkus.keycloak.policy-enforcer.enable=true を設定します。設定されていない場合、注入に使用できる Bean はありません。

1.13. 保護されたリソースのマッピング

デフォルトでは、エクステンションは遅延読み込みを使用して、オンデマンドで Keycloak からリソースを取得します。要求 URI を使用して、保護が必要なアプリケーションリソースを識別し、マッピングします。

遅延読み込みを無効にし、代わりに起動時にすべてのリソースを事前に読み込むには、次のプロパティーを設定します。

quarkus.keycloak.policy-enforcer.lazy-load-paths=false
Copy to Clipboard Toggle word wrap

起動時に 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
Copy to Clipboard Toggle word wrap

匿名ユーザーによるパブリックリソースへのアクセスを制限するには、強制的な Keycloak Authorization Policy を定義します。

quarkus.keycloak.policy-enforcer.paths.1.paths=/api/public-enforcing
quarkus.keycloak.policy-enforcer.paths.1.enforcement-mode=ENFORCING
Copy to Clipboard Toggle word wrap

パブリックリソースへの匿名アクセスを制御する必要がある場合、デフォルトのテナント設定のみが適用されます。

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 
1


# 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
Copy to Clipboard Toggle word wrap
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() { 
1

        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() 
2

                .transform(granted -> {
                    if (granted) {
                        return identity.getAttribute("permissions");
                    }
                    throw new ForbiddenException();
                });
    }

    @PermissionsAllowed("Scope Permission Resource:read") 
3

    @GET
    @Path("/annotation-way")
    public Uni<List<Permission>> annotationWay() {
        return Uni.createFrom().item(identity.<List<Permission>> getAttribute("permissions"));
    }
}
Copy to Clipboard Toggle word wrap
1
/standard-way サブパスには、application.properties ファイルで設定された設定に基づいて、リソース権限と read スコープの両方が必要です。
2
/programmatic-way サブパスは、デフォルトでは Scope Permission Resource 権限のみをチェックします。ただし、SecurityIdentity#checkPermission を使用すると、スコープ要件などの追加の制約を適用できます。
3
/annotation-way@PermissionsAllowed アノテーションは、read スコープとともに Scope Permission Resource 権限を持つリクエストへのアクセスを制限します。詳細は、Web エンドポイントの認可ガイドの アノテーションを使用した認可 セクションを参照してください。

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
Copy to Clipboard Toggle word wrap

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(enforcerConfig.defaultTenant()) 
1

            .paths("/enhanced-config")
            .permissionName("Permission Name")
            .get("read-scope")
            .build();
        this.newTenantConfig = KeycloakPolicyEnforcerTenantConfig.builder() 
2

            .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(); 
3

    }
}
Copy to Clipboard Toggle word wrap
1
デフォルトのテナント設定で /enhanced-config パスを定義または更新します。
2
プログラムによって設定されるカスタムクレームと値を含む、テナント設定に /new-config パスを追加します。
3
application.properties ファイルまたはその他の SmallRye Config ソースで定義されているデフォルトの静的テナント設定解決にフォールバックします。

1.19. 設定の参照

この設定は、公式ガイドラインの Keycloak Policy Enforcer Configuration に準拠しています。さまざまな設定オプションの詳細は、次のドキュメントを参照してください。

🔒 ビルド時に固定: 設定プロパティーはビルド時に固定されます。他のすべての設定プロパティーは実行時にオーバーライドできます。

Expand

設定プロパティー

デフォルト

🔒 ビルド時に修正 quarkus.keycloak.policy-enforcer.enabled

ポリシーの強制を有効化します。

環境変数: QUARKUS_KEYCLOAK_POLICY_ENFORCER_ENABLED

boolean

false

quarkus.keycloak.connection-pool-size

アダプターは、Keycloak サーバーへの個別の HTTP 呼び出しを行い、アクセスコードをアクセストークンに変換します。この設定オプションは、Keycloak サーバーへの接続をいくつプールするか定義します。

環境変数: QUARKUS_KEYCLOAK_CONNECTION_POOL_SIZE

int

20

quarkus.keycloak.policy-enforcer.enforcement-mode

ポリシーの強制方法を指定します。

環境変数: QUARKUS_KEYCLOAK_POLICY_ENFORCER_ENFORCEMENT_MODE

permissiveenforcingdisabled

enforcing

quarkus.keycloak.policy-enforcer.path-cache.max-entries

キャッシュに保持される必要があるエントリーの制限を定義します。

環境変数: QUARKUS_KEYCLOAK_POLICY_ENFORCER_PATH_CACHE_MAX_ENTRIES

int

1000

quarkus.keycloak.policy-enforcer.path-cache.lifespan

エントリーの期限が切れる時間 (ミリ秒単位) を定義します。

環境変数: QUARKUS_KEYCLOAK_POLICY_ENFORCER_PATH_CACHE_LIFESPAN

long

30000

quarkus.keycloak.policy-enforcer.lazy-load-paths

アプリケーションがパスに関連付けられたリソースのサーバーを取得する方法を指定します。true の場合、ポリシーエンフォーサーは要求されるパスに応じてオンデマンドでリソースを取得します。

環境変数: QUARKUS_KEYCLOAK_POLICY_ENFORCER_LAZY_LOAD_PATHS

boolean

true

quarkus.keycloak.policy-enforcer.claim-information-point."complex-config"

複雑な設定。

環境変数: QUARKUS_KEYCLOAK_POLICY_ENFORCER_CLAIM_INFORMATION_POINT__COMPLEX_CONFIG_

Map<String,Map<String,Map<String,String>>>

 

quarkus.keycloak.policy-enforcer.claim-information-point."simple-config"

単純な設定。

環境変数: QUARKUS_KEYCLOAK_POLICY_ENFORCER_CLAIM_INFORMATION_POINT__SIMPLE_CONFIG_

Map<String,Map<String,String>>

 

quarkus.keycloak.policy-enforcer.http-method-as-scope

スコープを HTTP メソッドにマッピングする方法を指定します。true に設定すると、ポリシーエンフォーサーは現在のリクエストから HTTP メソッドを使用して、アクセス権を付与すべきか確認します。

環境変数: QUARKUS_KEYCLOAK_POLICY_ENFORCER_HTTP_METHOD_AS_SCOPE

boolean

false

quarkus.keycloak.policy-enforcer.paths."paths".name

指定のパスに関連付けられるサーバー上のリソースの名前。

環境変数: QUARKUS_KEYCLOAK_POLICY_ENFORCER_PATHS__PATHS__NAME

string

 

quarkus.keycloak.policy-enforcer.paths."paths".paths

ポリシーエンフォーサーによって保護される必要がある HTTP 要求パス

環境変数: QUARKUS_KEYCLOAK_POLICY_ENFORCER_PATHS__PATHS__PATHS

list of string

 

quarkus.keycloak.policy-enforcer.paths."paths".methods."methods".method

HTTP メソッドの名前。

環境変数: QUARKUS_KEYCLOAK_POLICY_ENFORCER_PATHS__PATHS__METHODS__METHODS__METHOD

string

必須 ⚠️ 必須

quarkus.keycloak.policy-enforcer.paths."paths".methods."methods".scopes

メソッドに関連付けられたスコープを持つ文字列の配列。

環境変数: QUARKUS_KEYCLOAK_POLICY_ENFORCER_PATHS__PATHS__METHODS__METHODS__SCOPES

list of string

必須 ⚠️ 必須

quarkus.keycloak.policy-enforcer.paths."paths".methods."methods".scopes-enforcement-mode

メソッドに関連付けられたスコープの強制モードを参照する文字列。

環境変数: QUARKUS_KEYCLOAK_POLICY_ENFORCER_PATHS__PATHS__METHODS__METHODS__SCOPES_ENFORCEMENT_MODE

allanydisabled

all

quarkus.keycloak.policy-enforcer.paths."paths".enforcement-mode

ポリシーの強制方法を指定します。

環境変数: QUARKUS_KEYCLOAK_POLICY_ENFORCER_PATHS__PATHS__ENFORCEMENT_MODE

permissiveenforcingdisabled

enforcing

quarkus.keycloak.policy-enforcer.paths."paths".claim-information-point."complex-config"

複雑な設定。

環境変数: QUARKUS_KEYCLOAK_POLICY_ENFORCER_PATHS__PATHS__CLAIM_INFORMATION_POINT__COMPLEX_CONFIG_

Map<String,Map<String,Map<String,String>>>

 

quarkus.keycloak.policy-enforcer.paths."paths".claim-information-point."simple-config"

単純な設定。

環境変数: QUARKUS_KEYCLOAK_POLICY_ENFORCER_PATHS__PATHS__CLAIM_INFORMATION_POINT__SIMPLE_CONFIG_

Map<String,Map<String,String>>

 

追加の名前付きテナント

デフォルト

quarkus.keycloak."tenant".connection-pool-size

アダプターは、Keycloak サーバーへの個別の HTTP 呼び出しを行い、アクセスコードをアクセストークンに変換します。この設定オプションは、Keycloak サーバーへの接続をいくつプールするか定義します。

環境変数: QUARKUS_KEYCLOAK__TENANT__CONNECTION_POOL_SIZE

int

20

quarkus.keycloak."tenant".policy-enforcer.enforcement-mode

ポリシーの強制方法を指定します。

環境変数: QUARKUS_KEYCLOAK__TENANT__POLICY_ENFORCER_ENFORCEMENT_MODE

permissiveenforcingdisabled

enforcing

quarkus.keycloak."tenant".policy-enforcer.paths."paths".name

指定のパスに関連付けられるサーバー上のリソースの名前。

環境変数: QUARKUS_KEYCLOAK__TENANT__POLICY_ENFORCER_PATHS__PATHS__NAME

string

 

quarkus.keycloak."tenant".policy-enforcer.paths."paths".paths

ポリシーエンフォーサーによって保護される必要がある HTTP 要求パス

環境変数: QUARKUS_KEYCLOAK__TENANT__POLICY_ENFORCER_PATHS__PATHS__PATHS

list of string

 

quarkus.keycloak."tenant".policy-enforcer.paths."paths".methods."methods".method

HTTP メソッドの名前。

環境変数: QUARKUS_KEYCLOAK__TENANT__POLICY_ENFORCER_PATHS__PATHS__METHODS__METHODS__METHOD

string

必須 ⚠️ 必須

quarkus.keycloak."tenant".policy-enforcer.paths."paths".methods."methods".scopes

メソッドに関連付けられたスコープを持つ文字列の配列。

環境変数: QUARKUS_KEYCLOAK__TENANT__POLICY_ENFORCER_PATHS__PATHS__METHODS__METHODS__SCOPES

list of string

必須 ⚠️ 必須

quarkus.keycloak."tenant".policy-enforcer.paths."paths".methods."methods".scopes-enforcement-mode

メソッドに関連付けられたスコープの強制モードを参照する文字列。

環境変数: QUARKUS_KEYCLOAK__TENANT__POLICY_ENFORCER_PATHS__PATHS__METHODS__METHODS__SCOPES_ENFORCEMENT_MODE

allanydisabled

all

quarkus.keycloak."tenant".policy-enforcer.paths."paths".enforcement-mode

ポリシーの強制方法を指定します。

環境変数: QUARKUS_KEYCLOAK__TENANT__POLICY_ENFORCER_PATHS__PATHS__ENFORCEMENT_MODE

permissiveenforcingdisabled

enforcing

quarkus.keycloak."tenant".policy-enforcer.paths."paths".claim-information-point."complex-config"

複雑な設定。

環境変数: QUARKUS_KEYCLOAK__TENANT__POLICY_ENFORCER_PATHS__PATHS__CLAIM_INFORMATION_POINT__COMPLEX_CONFIG_

Map<String,Map<String,Map<String,String>>>

 

quarkus.keycloak."tenant".policy-enforcer.paths."paths".claim-information-point."simple-config"

単純な設定。

環境変数: QUARKUS_KEYCLOAK__TENANT__POLICY_ENFORCER_PATHS__PATHS__CLAIM_INFORMATION_POINT__SIMPLE_CONFIG_

Map<String,Map<String,String>>

 

quarkus.keycloak."tenant".policy-enforcer.path-cache.max-entries

キャッシュに保持される必要があるエントリーの制限を定義します。

環境変数: QUARKUS_KEYCLOAK__TENANT__POLICY_ENFORCER_PATH_CACHE_MAX_ENTRIES

int

1000

quarkus.keycloak."tenant".policy-enforcer.path-cache.lifespan

エントリーの期限が切れる時間 (ミリ秒単位) を定義します。

環境変数: QUARKUS_KEYCLOAK__TENANT__POLICY_ENFORCER_PATH_CACHE_LIFESPAN

long

30000

quarkus.keycloak."tenant".policy-enforcer.lazy-load-paths

アプリケーションがパスに関連付けられたリソースのサーバーを取得する方法を指定します。true の場合、ポリシーエンフォーサーは要求されるパスに応じてオンデマンドでリソースを取得します。

環境変数: QUARKUS_KEYCLOAK__TENANT__POLICY_ENFORCER_LAZY_LOAD_PATHS

boolean

true

quarkus.keycloak."tenant".policy-enforcer.claim-information-point."complex-config"

複雑な設定。

環境変数: QUARKUS_KEYCLOAK__TENANT__POLICY_ENFORCER_CLAIM_INFORMATION_POINT__COMPLEX_CONFIG_

Map<String,Map<String,Map<String,String>>>

 

quarkus.keycloak."tenant".policy-enforcer.claim-information-point."simple-config"

単純な設定。

環境変数: QUARKUS_KEYCLOAK__TENANT__POLICY_ENFORCER_CLAIM_INFORMATION_POINT__SIMPLE_CONFIG_

Map<String,Map<String,String>>

 

quarkus.keycloak."tenant".policy-enforcer.http-method-as-scope

スコープを HTTP メソッドにマッピングする方法を指定します。true に設定すると、ポリシーエンフォーサーは現在のリクエストから HTTP メソッドを使用して、アクセス権を付与すべきか確認します。

環境変数: QUARKUS_KEYCLOAK__TENANT__POLICY_ENFORCER_HTTP_METHOD_AS_SCOPE

boolean

false

1.20. 参考資料

法律上の通知

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat