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 権限を持つリクエストへのアクセスを制限します。詳細は、セキュリティー認可ガイドの アノテーションを使用した認可 セクションを参照してください。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2025 Red Hat