翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
例 3: RBAC によるマルチテナントアクセスコントロール
前の RBAC の例について詳しく説明するために、SaaS プロバイダーの一般的な要件である SaaS マルチテナンシーを含めるように要件を拡張できます。マルチテナントソリューションでは、リソースアクセスは常に特定のテナントに代わって提供されます。つまり、テナント A のユーザーは、データが論理的または物理的にシステムにコロケーションされている場合でも、テナント B のデータを表示できません。次の例は、複数の Verified Permissions ポリシーストアを使用してテナント分離を実装する方法と、ユーザーロールを使用してテナント内のアクセス許可を定義する方法を示しています。
テナントごとのポリシーストア設計パターンを使用することは、Verified Permissions によるアクセスコントロールを実装しながらテナントの分離を維持するためのベストプラクティスです。このシナリオでは、テナント A とテナント B のユーザーリクエストはDATAMICROSERVICE_POLICYSTORE_B
、それぞれ個別のポリシーストア DATAMICROSERVICE_POLICYSTORE_A
および に対して検証されます。マルチテナント SaaS アプリケーションの Verified Permissions 設計上の考慮事項の詳細については、「Verified Permissions マルチテナント設計上の考慮事項」セクションを参照してください。

次のポリシーは、DATAMICROSERVICE_POLICYSTORE_A
ポリシーストアにあります。プリンシパルがタイプ allAccessRole
のグループの一部であることを確認しますRole
。この場合、プリンシパルはテナント A に関連付けられているすべてのリソースに対して viewData
および updateData
アクションを実行できます。
permit ( principal in MultitenantApp::Role::"allAccessRole", action in [ MultitenantApp::Action::"viewData", MultitenantApp::Action::"updateData" ], resource );
次のポリシーは、DATAMICROSERVICE_POLICYSTORE_B
ポリシーストアにあります。最初のポリシーは、プリンシパルがタイプ のupdateDataRole
グループの一部であることを確認しますRole
。その場合、テナント B に関連付けられているリソースに対してupdateData
アクションを実行するアクセス許可をプリンシパルに付与します。
permit ( principal in MultitenantApp::Role::"updateDataRole", action == MultitenantApp::Action::"updateData", resource );
この 2 番目のポリシーでは、タイプ のviewDataRole
グループの一部であるプリンシパルが、テナント B に関連付けられているリソースに対して viewData
アクションを実行することを許可Role
する必要があります。
permit ( principal in MultitenantApp::Role::"viewDataRole", action == MultitenantApp::Action::"viewData", resource );
テナント A から行われた認可リクエストは、DATAMICROSERVICE_POLICYSTORE_A
ポリシーストアに送信され、そのストアに属するポリシーによって検証される必要があります。この場合、この例の一部として前述した最初のポリシーによって検証されます。この認可リクエストでは、 の値User
を持つ タイプのプリンシパルAlice
が viewData
アクションの実行をリクエストしています。プリンシパルは、タイプ allAccessRole
のグループに属しますRole
。Alice はSampleData
リソースに対して viewData
アクションを実行しようとしています。Alice には allAccessRole
ロールがあるため、この評価では がALLOW
決定されます。
{ "policyStoreId": "DATAMICROSERVICE_POLICYSTORE_A", "principal": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "action": { "actionType": "MultitenantApp::Action", "actionId": "viewData" }, "resource": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "entities": { "entityList": [ { "identifier": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "attributes": {}, "parents": [ { "entityType": "MultitenantApp::Role", "entityId": "allAccessRole" } ] }, { "identifier": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "attributes": {}, "parents": [] } ] } }
代わりに、 によってテナント B から行われたリクエストを表示するとUser Bob
、次のような承認リクエストが表示されます。リクエストはテナント B から発信されるため、DATAMICROSERVICE_POLICYSTORE_B
ポリシーストアに送信されます。このリクエストでは、プリンシパルはリソース updateData
に対して アクションを実行したいBob
と考えていますSampleData
。ただし、 Bob
は、そのリソースupdateData
に対する アクションにアクセスできるグループの一部ではありません。したがって、リクエストはDENY
決定になります。
{ "policyStoreId": "DATAMICROSERVICE_POLICYSTORE_B", "principal": { "entityType": "MultitenantApp::User", "entityId": "Bob" }, "action": { "actionType": "MultitenantApp::Action", "actionId": "updateData" }, "resource": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "entities": { "entityList": [ { "identifier": { "entityType": "MultitenantApp::User", "entityId": "Bob" }, "attributes": {}, "parents": [ { "entityType": "MultitenantApp::Role", "entityId": "viewDataRole" } ] }, { "identifier": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "attributes": {}, "parents": [] } ] } }
この 3 番目の例では、 はリソース に対して viewData
アクションを実行User Alice
しようとしますSampleData
。このリクエストは、プリンシパルがテナント A にAlice
属しているため、DATAMICROSERVICE_POLICYSTORE_A
ポリシーストアに送信されます。 Alice
はタイプ allAccessRole
のグループの一部でありRole
、 リソースに対して viewData
アクションを実行することを許可します。そのため、リクエストは ALLOW
決定になります。
{ "policyStoreId": "DATAMICROSERVICE_POLICYSTORE_A", "principal": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "action": { "actionType": "MultitenantApp::Action", "actionId": "viewData" }, "resource": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "entities": { "entityList": [ { "identifier": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "attributes": {}, "parents": [ { "entityType": "MultitenantApp::Role", "entityId": "allAccessRole" } ] }, { "identifier": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "attributes": {}, "parents": [] } ] } }