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/unsecuredエンドポイントは、@PermitAllアノテーションを指定することにより、認証されていないアクセスを許可します。- 4
- ユーザープリンシパルを取得する呼び出しは、呼び出し元が認証されていない場合は
nullを返し、呼び出し元が認証されている場合はnon-nullを返します。 - 5
/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. 権限のアノテーション リンクのコピーリンクがクリップボードにコピーされました!
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 を更新する権限を付与する方法を示しています。
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 に権限がないためです。