

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 示例 3：使用 RBAC 进行多租户访问控制
<a name="avp-mt-abac-examples"></a>

要详细说明前面的 RBAC 示例，您可以扩展您的要求以包括 SaaS 多租户，这是 SaaS 提供商的常见要求。在多租户解决方案中，总是代表给定租户提供资源访问权限。也就是说，租户 A 的用户无法查看租户 B 的数据，即使这些数据在逻辑上或物理上并置在系统中。以下示例说明了如何使用多个[已验证权限策略存储](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/policy-stores.html)来实现租户隔离，以及如何使用用户角色在租户内定义权限。

使用每租户策略存储设计模式是在使用已验证权限实施访问控制的同时保持租户隔离的最佳实践。在这种情况下，租户 A 和租户 B 的用户请求将分别根据不同的策略存储`DATAMICROSERVICE_POLICYSTORE_A`和进行`DATAMICROSERVICE_POLICYSTORE_B`验证。有关多租户 SaaS 应用程序的已验证权限设计注意事项的更多信息，请参阅[已验证权限多租户设计注意事项部分](avp-design-considerations.md)。

![\[使用 RBAC、Amazon 验证权限和 Cedar 进行多租户访问控制的示例\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/images/avp-example-3.png)


以下策略位于`DATAMICROSERVICE_POLICYSTORE_A`策略存储中。它验证主体是否将成为该类型`Role`组`allAccessRole`的一部分。在这种情况下，将允许委托人对与租户 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
);
```

第二项政策规定，`Role`应允许属于该类型`viewDataRole`组的委托人对与租户 `viewData` B 关联的资源执行操作。

```
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`，则会看到类似以下授权请求的内容。该请求之所以被发送到`DATAMICROSERVICE_POLICYSTORE_B`策略存储，是因为它来自租户 B。在此请求中，委托`Bob`人想要`updateData`对资源`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": []
      }
    ]
  }
}
```

在第三个示例中，`User Alice `尝试对资源执行`viewData`操作`SampleData`。此请求被定向到`DATAMICROSERVICE_POLICYSTORE_A`策略存储，因为委托人`Alice`属于租户 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": []
      }
    ]
  }
}
```