Web エンドポイントの認可
概要
Red Hat build of Quarkus ドキュメントへのフィードバックの提供 リンクのコピーリンクがクリップボードにコピーされました!
エラーを報告したり、ドキュメントを改善したりするには、Red Hat Jira アカウントにログインし、課題を送信してください。Red Hat Jira アカウントをお持ちでない場合は、アカウントを作成するように求められます。
手順
- 次のリンクをクリックして チケットを作成します。
- Summary に課題の簡単な説明を入力します。
- Description に課題や機能拡張の詳細な説明を入力します。問題があるドキュメントのセクションへの URL も記載してください。
- Submit をクリックすると、課題が作成され、適切なドキュメントチームに転送されます。
第1章 Web エンドポイントの認可 リンクのコピーリンクがクリップボードにコピーされました!
Quarkus には、プラグ可能な Web セキュリティーレイヤーが組み込まれています。セキュリティーを有効にすると、システムはすべての HTTP リクエストに対して権限チェックを実行し、リクエストを続行するかどうかを決定します。
quarkus.http.auth. 設定によってパスが制限されている場合は、@PermitAll を使用してもパスは開きません。特定のパスにアクセスできるようにするには、Quarkus のセキュリティー設定内で適切な設定を行う必要があります。
Jakarta RESTful Web サービスを使用する場合は、HTTP パスレベルのマッチングではなく、quarkus.security.jaxrs.deny-unannotated-endpoints または quarkus.security.jaxrs.default-roles-allowed を使用してデフォルトのセキュリティー要件を設定することを検討してください。アノテーションにより、個々のエンドポイントでこれらのプロパティーをオーバーライドできるためです。
認可は、セキュリティープロバイダーが提供するユーザーロールに基づいて行われます。ユーザーロールをカスタマイズするには、SecurityIdentityAugmentor を作成します。Security Identity Customization を参照してください。
1.1. 設定を使用した認可 リンクのコピーリンクがクリップボードにコピーされました!
権限は、Quarkus 設定で権限セットによって定義されます。各権限セットで、アクセス制御用のポリシーを指定します。
| 組み込みのポリシー | 説明 |
|---|---|
|
| このポリシーはすべてのユーザーを拒否します。 |
|
| このポリシーはすべてのユーザーを許可します。 |
|
| このポリシーは認証済みユーザーのみを許可します。 |
特定のロールを持つユーザーにリソースへのアクセスを許可するロールベースのポリシーを定義できます。
ロールベースのポリシーの例
quarkus.http.auth.policy.role-policy1.roles-allowed=user,admin
quarkus.http.auth.policy.role-policy1.roles-allowed=user,admin
- 1
- これは、
userロールとadminロールを持つユーザーを許可するロールベースのポリシーを定義します。
次の設定例に示すように、application.properties ファイルで定義されている組み込みの権限セットを設定することで、カスタムポリシーを参照できます。
ポリシー設定の例
上記の例の正確なパスパターン /forbidden は、/forbidden/ パスも保護します。この方法では、以下の例の forbidden エンドポイントは deny1 権限により保護されます。
- 1
forbiddenエンドポイントを保護するには、/forbiddenパスと/forbidden/パスの両方を保護する必要があります。
/forbidden/ パスへのアクセスを許可する必要がある場合は、以下の例のように、より具体的な正確なパスを使用して新しい権限を追加してください。
quarkus.http.auth.permission.permit1.paths=/forbidden/ quarkus.http.auth.permission.permit1.policy=permit
quarkus.http.auth.permission.permit1.paths=/forbidden/
quarkus.http.auth.permission.permit1.policy=permit
- 1
/forbidden/パスは保護されていません。
1.1.1. カスタムの HttpSecurityPolicy リンクのコピーリンクがクリップボードにコピーされました!
場合に応じて、独自の名前付きポリシーを登録すると便利です。これを実行するには、io.quarkus.vertx.http.runtime.security.HttpSecurityPolicy インターフェイスを実装するアプリケーションスコープの CDI Bean を作成します。以下にその例を示します。
- 1
- 名前付き HTTP セキュリティーポリシーは、
application.propertiesパスマッチングルールにマッチするリクエストにのみ適用されます。
設定ファイルから参照されるカスタム名の HttpSecurityPolicy の例
quarkus.http.auth.permission.custom1.paths=/custom/* quarkus.http.auth.permission.custom1.policy=custom
quarkus.http.auth.permission.custom1.paths=/custom/*
quarkus.http.auth.permission.custom1.policy=custom
- 1
- カスタムポリシー名は、
io.quarkus.vertx.http.runtime.security.HttpSecurityPolicy.nameメソッドによって返される値とマッチする必要があります。
すべてのリクエストで呼び出されるグローバルの HttpSecurityPolicy を作成することもできます。io.quarkus.vertx.http.runtime.security.HttpSecurityPolicy.name メソッドを実装せず、ポリシーに名前を付けないままにしてください。
1.1.2. パスとメソッドのマッチング リンクのコピーリンクがクリップボードにコピーされました!
権限セットでは、パスとメソッドをコンマ区切りリスト形式で指定することもできます。パスの末尾がワイルドカード * の場合は、そのパスによって生成されたクエリーがすべてのサブパスにマッチします。それ以外の場合は、クエリーが完全一致を照会し、特定のパスにのみマッチします。
quarkus.http.auth.permission.permit1.paths=/public*,/css/*,/js/*,/robots.txt quarkus.http.auth.permission.permit1.policy=permit quarkus.http.auth.permission.permit1.methods=GET,HEAD
quarkus.http.auth.permission.permit1.paths=/public*,/css/*,/js/*,/robots.txt
quarkus.http.auth.permission.permit1.policy=permit
quarkus.http.auth.permission.permit1.methods=GET,HEAD
- 1
- パスの末尾の
*ワイルドカードは、0 個以上のパスセグメントにマッチしますが、/publicパスから始まる単語にはマッチしません。そのため、/public-infoのようなパスはこのパターンにマッチしません。
1.1.3. パスにはマッチするがメソッドにはマッチしない場合 リンクのコピーリンクがクリップボードにコピーされました!
パスに基づいて 1 つ以上の権限セットにマッチしても、必要なメソッドのいずれにもマッチしないと、リクエストは拒否されます。
上記の権限セットが指定されていると、GET/public/foo は、パスとメソッドの両方にマッチするため、許可されます。対照的に、POST/public/foo は、パスにはマッチしますが、メソッドにはマッチしないため、拒否されます。
1.1.4. 複数のパスのマッチング: 最長パスが優先される リンクのコピーリンクがクリップボードにコピーされました!
マッチングは、常に "最長パスが優先される" という基準で行われます。より詳細な権限セットがマッチした場合、それよりも詳細でない権限セットは考慮されません。
上記の権限セットの場合、GET /public/forbidden-folder/foo は、両方の権限セットのパスとマッチします。しかし、より長いパスが deny1 権限セットのパスとマッチするため、deny1 が選択され、リクエストが拒否されます。
前述の deny1 権限と permit1 権限の例で示したように、サブパスの権限がルートパスの権限よりも優先されます。
このルールをさらに例示するために、サブパス権限ではパブリックリソースへのアクセスを許可し、ルートパス権限では認可を要求するシナリオを示します。
1.1.5. 複数のサブパスのマッチング: * ワイルドカードへの最長パスが優先される リンクのコピーリンクがクリップボードにコピーされました!
前の例では、パスの末尾が * ワイルドカードの場合に、すべてのサブパスがマッチすることを示しました。
このワイルドカードは、パスの途中にも適用され、単一のパスセグメントを表します。他のパスセグメント文字と混在させることはできません。したがって、/public/*/about-us パスのように、* ワイルドカードは常にパス区切り文字によって囲まれます。
複数のパスパターンが同じリクエストパスに対応する場合、システムは * ワイルドカードに至る最長のサブパスを選択します。この場合は、すべてのパスセグメント文字が * ワイルドカードよりも詳細なものとして扱われます。
以下は簡単な例です。
quarkus.http.auth.permission.secured.paths=/api/*/detail quarkus.http.auth.permission.secured.policy=authenticated quarkus.http.auth.permission.public.paths=/api/public-product/detail quarkus.http.auth.permission.public.policy=permit
quarkus.http.auth.permission.secured.paths=/api/*/detail
quarkus.http.auth.permission.secured.policy=authenticated
quarkus.http.auth.permission.public.paths=/api/public-product/detail
quarkus.http.auth.permission.public.policy=permit
認可を使用した設定で保護するパスは、すべてテストする必要があります。複数のワイルドカードを使用してパスパターンを記述するのは、手間がかかる場合があります。パスが意図したとおりに認可されていることを確認してください。
次の例では、パスは最も詳細なものから最も詳細でないものの順に並べられています。
最も詳細なパスから最も詳細でないパスの順に並べたリクエストパス /one/two/three/four/five のマッチ
パスの末尾の * ワイルドカードは、0 個以上のパスセグメントとマッチします。その他の場所に指定された * ワイルドカードは、1 つのパスセグメントに完全一致します。
1.1.6. 複数のパスのマッチング: 最も詳細なメソッドが優先される リンクのコピーリンクがクリップボードにコピーされました!
パスが複数の権限セットに登録されている場合は、リクエストにマッチする HTTP メソッドを明示的に指定している権限セットが優先されます。この場合、メソッドのない権限セットが適用されるのは、リクエストメソッドがメソッドの指定を持つ権限セットとマッチしない場合に限られます。
上記の権限セットは、GET/public/foo が両方の権限セットのパスにマッチすることを示しています。ただし、これは permit1 権限セットの明示的なメソッドと明確に一致しています。したがって、permit1 が選択され、リクエストが受け入れられます。
対照的に、PUT/public/foo は、permit1 のメソッド権限とマッチしません。その結果、deny1 がアクティブになり、リクエストが拒否されます。
1.1.7. 複数のパスとメソッドのマッチング: どちらも優先される リンクのコピーリンクがクリップボードにコピーされました!
場合に応じて、前述のルールにより、複数の権限セットが同時に適用されることがあります。その場合、リクエストを続行するには、すべての権限でアクセスが許可されている必要があります。これを実現するには、両方にメソッドを追加するか、両方からメソッドを除外する必要があります。メソッド固有のマッチが優先されます。
上記の権限セットの場合、GET /api/foo は両方の権限セットのパスにマッチするため、user と admin の両方のロールが必要です。
1.1.8. アクセスを拒否するための設定プロパティー リンクのコピーリンクがクリップボードにコピーされました!
次の設定は、ロールベースのアクセス制御 (RBAC) の拒否動作を変更するものです。
quarkus.security.jaxrs.deny-unannotated-endpoints=true|false-
true に設定すると、すべての Jakarta REST エンドポイントへのアクセスがデフォルトで拒否されます。Jakarta REST エンドポイントにセキュリティーアノテーションがない場合は、エンドポイントのデフォルトが
@DenyAll動作になります。これにより、保護されているはずのエンドポイントが誤って公開されることを回避できます。デフォルトはfalseです。 quarkus.security.jaxrs.default-roles-allowed=role1,role2-
アノテーションのないエンドポイントのデフォルトのロール要件を定義します。
**ロールは、すべての認証済みユーザーを意味する特別なロールです。これをdeny-unannotated-endpointsと組み合わせることはできません。代わりにdenyが有効になるためです。 quarkus.security.deny-unannotated-members=true|false-
true に設定すると、セキュリティーアノテーションを持たないが、セキュリティーアノテーションを持つメソッドを含むクラスで定義されているすべての CDI メソッドと Jakarta REST エンドポイントへのアクセスが拒否されます。デフォルトは
falseです。
1.1.9. 権限の無効化 リンクのコピーリンクがクリップボードにコピーされました!
次のように、宣言された各権限に対して enabled プロパティーを設定することで、ビルド時に権限を無効にできます。
quarkus.http.auth.permission.permit1.enabled=false quarkus.http.auth.permission.permit1.paths=/public/*,/css/*,/js/*,/robots.txt quarkus.http.auth.permission.permit1.policy=permit quarkus.http.auth.permission.permit1.methods=GET,HEAD
quarkus.http.auth.permission.permit1.enabled=false
quarkus.http.auth.permission.permit1.paths=/public/*,/css/*,/js/*,/robots.txt
quarkus.http.auth.permission.permit1.policy=permit
quarkus.http.auth.permission.permit1.methods=GET,HEAD
権限は、システムプロパティーまたは環境変数 (例: -Dquarkus.http.auth.permission.permit1.enabled=true) を使用して実行時に再度有効にできます。
1.1.10. 権限パスと HTTP ルートパス リンクのコピーリンクがクリップボードにコピーされました!
quarkus.http.root-path 設定プロパティーは、http エンドポイントのコンテキストパス を変更します。
デフォルトでは、quarkus.http.root-path は設定した権限パスの先頭に自動的に追加されるため、スラッシュを使用しないでください。次に例を示します。
quarkus.http.auth.permission.permit1.paths=public/*,css/*,js/*,robots.txt
quarkus.http.auth.permission.permit1.paths=public/*,css/*,js/*,robots.txt
この設定は次のものと同等です。
quarkus.http.auth.permission.permit1.paths=${quarkus.http.root-path}/public/*,${quarkus.http.root-path}/css/*,${quarkus.http.root-path}/js/*,${quarkus.http.root-path}/robots.txt
quarkus.http.auth.permission.permit1.paths=${quarkus.http.root-path}/public/*,${quarkus.http.root-path}/css/*,${quarkus.http.root-path}/js/*,${quarkus.http.root-path}/robots.txt
先頭にスラッシュを付けると、設定された権限パスの解釈方法が変わります。設定された URL がそのまま使用され、quarkus.http.root-path の値が変更されても、パスが調整されません。
例:
quarkus.http.auth.permission.permit1.paths=/public/*,css/*,js/*,robots.txt
quarkus.http.auth.permission.permit1.paths=/public/*,css/*,js/*,robots.txt
この設定は、固定または静的 URL /public から提供されるリソースにのみ影響します。この URL は、quarkus.http.root-path が / 以外に設定されていると、アプリケーションリソースとマッチしない可能性があります。
詳細は、Path Resolution in Quarkus を参照してください。
1.1.11. SecurityIdentity ロールのマッピング リンクのコピーリンクがクリップボードにコピーされました!
優先されるロールベースのポリシーにより、SecurityIdentity ロールをデプロイメント固有のロールにマッピングできます。その後、デプロイメント固有のロールを、@RolesAllowed アノテーションを使用してエンドポイント認可に適用できます。
quarkus.http.auth.policy.admin-policy1.roles.admin=Admin1 quarkus.http.auth.permission.roles1.paths=/* quarkus.http.auth.permission.roles1.policy=admin-policy1
quarkus.http.auth.policy.admin-policy1.roles.admin=Admin1
quarkus.http.auth.permission.roles1.paths=/*
quarkus.http.auth.permission.roles1.policy=admin-policy1
パスに関係なく、SecurityIdentity ロールをデプロイメント固有のロールにマップするだけの場合は、次のようにすることもできます。
quarkus.http.auth.roles-mapping.admin=Admin1
quarkus.http.auth.roles-mapping.admin=Admin1
1.2. アノテーションを使用した認可 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat build of Quarkus には、REST エンドポイントと CDI Bean 上の共通セキュリティーアノテーション @RolesAllowed、@DenyAll、@PermitAll に基づく ロールベースのアクセス制御 (RBAC) を可能にするセキュリティーが組み込まれています。
| アノテーションタイプ | 説明 |
|---|---|
|
| どのセキュリティーロールも指定のメソッドを呼び出すことができないことを指定します。 |
|
| すべてのセキュリティーロールが指定のメソッドを呼び出せることを指定します。
|
|
| アプリケーション内のメソッドへのアクセスを許可するセキュリティーロールのリストを指定します。 |
|
|
Red Hat build of Quarkus は、認証されたすべてのユーザーがリソースにアクセスできるようにする |
次の SubjectExposingResource の例は、エンドポイントの記述および保護に Jakarta REST と Common Security アノテーションの両方を使用するエンドポイントを示しています。
SubjectExposingResource の例
- 1
/subject/securedエンドポイントは、@RolesAllowed("Tester")アノテーションを使用して "Tester" ロールが付与された認証済みユーザーを必要とします。- 2
- エンドポイントは、Jakarta REST
SecurityContextからユーザープリンシパルを取得します。これは、保護されたエンドポイントに対してnon-nullを返します。 - 3
/subject/authenticatedエンドポイントでは、@Authenticatedアノテーションを指定して、認証されたすべてのユーザーを許可します。- 4
/subject/unsecuredエンドポイントは、@PermitAllアノテーションを指定することにより、認証されていないアクセスを許可します。- 5
- ユーザープリンシパルを取得する呼び出しは、呼び出し元が認証されていない場合は
nullを返し、呼び出し元が認証されている場合はnon-nullを返します。 - 6
/subject/deniedエンドポイントは、@DenyAllアノテーションを宣言することにより、呼び出し元のユーザーに関係なく、REST メソッドとしての直接アクセスをすべて禁止します。このメソッドは、このクラスの他のメソッドによって内部的に呼び出すことができます。
IO スレッドで標準のセキュリティーアノテーションを使用する予定の場合は、プロアクティブ認証 の情報を確認してください。
@RolesAllowed アノテーション値は、デフォルト値やネストされたプロパティー式を含む プロパティー式 をサポートします。アノテーションで使用される設定プロパティーは実行時に解決されます。
| アノテーション | 値の説明 |
|---|---|
|
|
エンドポイントは、 |
|
| 値に複数の変数を含めることができることを示す例。 |
|
|
デフォルト値の例示。必要なロールを、 |
@RolesAllowed アノテーションでのプロパティー式の使用例
サブジェクトアクセス制御の例
- 1
@RolesAllowedアノテーションの値は、Administratorという値に設定されます。- 2
- この
/subject/software-testerエンドポイントには、"Software-Tester" ロールが付与された認証済みユーザーが必要です。ロールの定義では複数の式を使用できます。 - 3
- この
/subject/userエンドポイントには、@RolesAllowed("${customer:User}")アノテーションを使用して "User" ロールが付与された認証済みユーザーが必要です。これは、設定プロパティーcustomerを設定しなかったためです。 - 4
- 実稼働環境では、この
/subject/securedエンドポイントには、Userロールを持つ認証済みユーザーが必要です。開発モードでは、すべての認証済みユーザーが許可されます。 - 5
- プロパティー式
all-rolesは、コレクション型Listとして扱われます。そのため、このエンドポイントには、Administrator、Software、Tester、Userの各ロールがアクセスできるようになります。
1.2.1. エンドポイントセキュリティーアノテーションと Jakarta REST 継承 リンクのコピーリンクがクリップボードにコピーされました!
Quarkus は、次の例のようにエンドポイント実装またはそのクラスに配置されたセキュリティーアノテーションをサポートしています。
デフォルトのインターフェイスメソッドとして宣言された RESTEasy サブリソースロケータは、標準のセキュリティーアノテーションでは保護できません。保護されたサブリソースロケータは、次の例のように、インターフェイス実装者に実装され、保護される必要があります。
1.2.2. 権限のアノテーション リンクのコピーリンクがクリップボードにコピーされました!
Quarkus は、指定の権限を持つ認証済みユーザーにリソースへのアクセスを許可する io.quarkus.security.PermissionsAllowed アノテーションも備えています。このアノテーションは、一般的なセキュリティーアノテーションの拡張であり、SecurityIdentity インスタンスに付与された権限をチェックします。
@PermissionsAllowed アノテーションで保護されたエンドポイントの例
- 1
- リソースメソッド
createOrUpdateにアクセスできるのは、create権限とupdate権限の両方を持つユーザーのみです。 - 2
- デフォルトでは、1 つのアノテーションインスタンスを通じて指定された権限のうち、少なくとも 1 つの権限が必要です。
inclusive=trueを設定することで、すべての権限を必須にできます。両方のリソースメソッドcreateOrUpdateに、同等の認可要件があります。 - 3
SecurityIdentityにread権限またはsee権限と、allアクションまたはdetailアクションのどちらかがある場合は、getItemへのアクセスが許可されます。- 4
- 任意の
java.security.Permission実装を使用できます。デフォルトでは、文字列ベースの権限はio.quarkus.security.StringPermissionにより実行されます。 - 5
- 権限は Bean ではないため、Bean インスタンスを取得する唯一の方法は、
Arc.container()を使用してプログラム的に取得することです。
IO スレッドで @PermissionsAllowed を使用する予定の場合は、プロアクティブ認証 の情報を確認してください。
Quarkus インターセプターの制限により、@PermissionsAllowed をクラスレベルで繰り返すことはできません。詳細は、Quarkus "CDI reference" ガイドの Repeatable interceptor bindings セクションを参照してください。
ロールが有効な SecurityIdentity インスタンスに権限を追加する最も簡単な方法は、ロールを権限にマッピングすることです。次の例に示すように、設定を使用した認可 を使用して、認可されたリクエストに、CRUDResource エンドポイントに必要な SecurityIdentity 権限を付与します。
- 1
userロールのSecurityIdentityインスタンスに、see権限とallアクションを追加します。同様に、@PermissionsAllowedアノテーションには、io.quarkus.security.StringPermissionがデフォルトで使用されます。- 2
create権限、update権限、およびread権限が、adminロールにマッピングされます。- 3
- ロールポリシー
role-policy1は、認証されたリクエストのみが/crud/modifyおよび/crud/idサブパスにアクセスできるようにします。パスマッチングアルゴリズムの詳細は、このガイドで後述する 複数のパスのマッチング: 最長パスが優先される を参照してください。 - 4
java.security.Permissionクラスのカスタム実装を指定できます。カスタムクラスでは、権限名とアクション (任意) を受け入れるコンストラクター (String配列など) を 1 つだけ定義する必要があります。この場合は、権限listがnew CustomPermission("list")としてSecurityIdentityインスタンスに追加されます。
追加のコンストラクターパラメーターを使用して、カスタム java.security.Permission クラスを作成することもできます。この追加パラメーターは、@PermissionsAllowed アノテーションが付けられたメソッドの引数とマッチします。その後、Quarkus が実際の引数を使用してカスタム権限をインスタンス化します。この権限を使用して、@PermissionsAllowed アノテーションが付けられたメソッドが呼び出されます。
追加の引数を受け入れるカスタムの java.security.Permission クラスの例
- 1
- カスタムの
Permissionクラスのコンストラクターは、1 つだけである必要があります。最初のパラメーターは、常に権限名とみなされ、String型である必要があります。Quarkus は、必要に応じてコンストラクターに権限アクションを渡すことができます。これを実現するには、2 番目のパラメーターをString[]として宣言します。
LibraryPermission クラスは、SecurityIdentity が read、write、list などの必要なアクションのいずれかを実行することを許可されている場合に、現在のライブラリーまたは親ライブラリーへのアクセスを許可します。
次の例は、LibraryPermission クラスの使用方法を示しています。
- 1
- 正式なパラメーターの
updateは、最初のLibraryパラメーターとして識別され、LibraryPermissionクラスに渡されます。ただし、updateLibraryメソッドを呼び出すたびにLibraryPermissionをインスタンス化する必要があります。 - 2
- ここで、最初の
Libraryパラメーターはmigrateです。したがって、libraryパラメーターは、PermissionsAllowed#paramsによって明示的にマークされます。権限コンストラクターとアノテーション付きメソッドには、libraryパラメーターが設定されている必要があります。設定しないと、検証が失敗します。
LibraryPermission で保護されたリソースの例
CRUDResource の例と同様に、次の例は、admin ロールを持つユーザーに MediaLibrary を更新する権限を付与する方法を示しています。
- 1
- ネイティブ実行可能ファイルをビルドする場合は、権限クラスをリフレクション用に登録する必要があります。ただし、1 つ以上の
io.quarkus.security.PermissionsAllowed#nameパラメーターでもその権限クラスが使用されている場合を除きます。@RegisterForReflectionアノテーションの詳細は、native application tips ページを参照してください。 - 2
MediaLibraryインスタンスをLibraryPermissionコンストラクターに渡します。
quarkus.http.auth.policy.role-policy3.permissions.admin=media-library:list,media-library:read,media-library:write quarkus.http.auth.policy.role-policy3.permission-class=org.acme.library.MediaLibraryPermission quarkus.http.auth.permission.roles3.paths=/library/* quarkus.http.auth.permission.roles3.policy=role-policy3
quarkus.http.auth.policy.role-policy3.permissions.admin=media-library:list,media-library:read,media-library:write
quarkus.http.auth.policy.role-policy3.permission-class=org.acme.library.MediaLibraryPermission
quarkus.http.auth.permission.roles3.paths=/library/*
quarkus.http.auth.permission.roles3.policy=role-policy3
- 1
read、write、およびlistアクションを許可する権限media-libraryを付与します。MediaLibraryはTvLibraryクラスの親であるため、adminロールを持つユーザーもTvLibraryを変更することが許可されます。
/library/* パスは、Keycloak プロバイダーの Dev UI ページからテストできます。Dev Services for Keycloak によって自動的に作成されるユーザー alice が、admin ロールを持っているためです。
これまでに示した例は、ロールと権限のマッピングを示しています。SecurityIdentity インスタンスには、プログラムで権限を追加することも可能です。次の例では、SecurityIdentity をカスタマイズ して、以前に HTTP ロールのポリシーで付与したものと同じ権限を追加します。
プログラムで SecurityIdentity に LibraryPermission を追加する例
アノテーションベースの権限は、カスタムの Jakarta REST SecurityContexts では機能しません。jakarta.ws.rs.core.SecurityContext に権限がないためです。