5.3. JavaScript ベースのポリシー
以下の例のように、ポリシーの実装で属性ベースのアクセス制御 (ABAC) を使用している場合は、ユーザーが保護された属性を編集できず、対応する属性が読み取り専用であることを確認してください。詳細については、脅威モデルの軽減の章 を参照してください。
このタイプのポリシーを使用して、JavaScript を使用してパーミッションの条件を定義することができます。Red Hat Single Sign-On でサポートされるルールベースのポリシータイプの 1 つで、評価 API に基づいて任意のポリシーを作成する柔軟性を提供します。
新しい JavaScript ベースのポリシーを作成するには、ポリシーリストの右上隅にある項目リストで JavaScript を選択します。
デフォルトでは、JavaScript ポリシーはサーバーにアップロードできません。JavaScript プロバイダー で説明されているように、JS ポリシーを直接サーバーにデプロイすることが推奨されます。
5.3.1. デプロイ済みの JAR ファイルからの JS ポリシーの作成
Red Hat Single Sign-On では、JAR ファイルをデプロイして、スクリプトをサーバーにデプロイできます。詳細は、JavaScript プロバイダー を参照してください。
スクリプトをデプロイしたら、利用可能なポリシープロバイダーの一覧からデプロイしたスクリプトを選択できるはずです。
5.3.2. 例
5.3.2.1. 評価コンテキストの属性の確認
以下は、属性ベースのアクセス制御 (ABAC) を使用して、実行コンテキストから取得した属性に基づいて条件を定義する JavaScript ベースのポリシーの簡単な例です。
const context = $evaluation.getContext(); const contextAttributes = context.getAttributes(); if (contextAttributes.containsValue('kc.client.network.ip_address', '127.0.0.1')) { $evaluation.grant(); }
5.3.2.2. 現在のアイデンティティーの属性の確認
以下は、属性ベースのアクセス制御 (ABAC) を使用して、現在のアイデンティティーに関連付けられた属性に基づいて条件を定義する JavaScript ベースのポリシーの簡単な例です。
const context = $evaluation.getContext(); const identity = context.getIdentity(); const attributes = identity.getAttributes(); const email = attributes.getValue('email').asString(0); if (email.endsWith('@keycloak.org')) { $evaluation.grant(); }
これらの属性は、認可要求で使用されたトークンで定義された要求からマッピングされます。
5.3.2.3. 現在のアイデンティティーに付与されるロールの確認
ポリシーでロールベースアクセス制御 (RBAC) を使用することもできます。以下の例では、ユーザーに keycloak_user
realm ロールが付与されているかどうかを確認します。
const context = $evaluation.getContext(); const identity = context.getIdentity(); if (identity.hasRealmRole('keycloak_user')) { $evaluation.grant(); }
または、ユーザーに my-client-role
client ロールが付与されているかどうかを確認できます。ここでは、my-client
はクライアントアプリケーションのクライアント ID になります。
const context = $evaluation.getContext(); const identity = context.getIdentity(); if (identity.hasClientRole('my-client', 'my-client-role')) { $evaluation.grant(); }
5.3.2.4. ユーザーに付与されているロールの確認
ユーザーに付与されたレルムロールを確認するには、次のコマンドを実行します。
const realm = $evaluation.getRealm(); if (realm.isUserInRealmRole('marta', 'role-a')) { $evaluation.grant(); }
または、ユーザーに付与されているクライアントロールの場合は、以下を実行します。
const realm = $evaluation.getRealm(); if (realm.isUserInClientRole('marta', 'my-client', 'some-client-role')) { $evaluation.grant(); }
5.3.2.5. グループに付与されているロールの確認
グループに付与されたレルムロールを確認するには、以下を実行します。
const realm = $evaluation.getRealm(); if (realm.isGroupInRole('/Group A/Group D', 'role-a')) { $evaluation.grant(); }
5.3.2.6. 任意のクレームをリソースサーバーへプッシュする
任意の要求をリソースサーバーにプッシュし、パーミッションの適用方法に関する追加情報を提供します。
const permission = $evaluation.getPermission(); // decide if permission should be granted if (granted) { permission.addClaim('claim-a', 'claim-a'); permission.addClaim('claim-a', 'claim-a1'); permission.addClaim('claim-b', 'claim-b'); }
5.3.2.7. グループメンバーシップの確認
const realm = $evaluation.getRealm(); if (realm.isUserInGroup('marta', '/Group A/Group B')) { $evaluation.grant(); }
5.3.2.8. 異なるアクセス制御メカニズムの組み合わせ
複数のアクセス制御メカニズムの組み合わせを使用することもできます。以下の例は、同じポリシー内でロール (RBAC) および Request/attributes(ABAC) チェックを使用できる方法を示しています。この場合、ユーザーに admin
ロールが付与されているか、keycloak.org
ドメインからの電子メールがあるかどうかを確認します。
const context = $evaluation.getContext(); const identity = context.getIdentity(); const attributes = identity.getAttributes(); const email = attributes.getValue('email').asString(0); if (identity.hasRealmRole('admin') || email.endsWith('@keycloak.org')) { $evaluation.grant(); }
独自のルールを記述する際は、$evaluation オブジェクトが org.keycloak.authorization.policy.evaluation.Evaluation を実装するオブジェクトであることに留意してください。このインターフェイスからアクセスできる内容の詳細は、評価 API を参照してください。