

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

# 示例 3：使用 OPA 和 Rego 对 RBAC 和 ABAC 进行多租户访问控制
<a name="opa-abac-rbac-examples"></a>

要增强上一节中的 RBAC 示例，您可以向用户添加属性。 

![\[RBAC 和 ABAC 有 OPA 和 Rego\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/images/opa-example-3.png)


此示例包含与上一个示例相同的角色，但添加了用户属性`account_lockout_flag`。这是用户特定的属性，与任何特定角色均无关联。您可以使用之前在本示例中使用的 RBAC 外部数据： 

```
 {
    "roles": {
        "tenant_a": {
            "all_access_role": ["viewData", "updateData"]
        },
        "tenant_b": {
            "update_data_role": ["updateData"],
            "view_data_role": ["viewData"]
        }
    }
}
```

可以将`account_lockout_flag`用户属性作为用户 Bob 的 OPA 查询输入的一部分传递给数据服务：`/viewData/tenant_a`

```
 {
    "tenant_id": "tenant_a",
    "role": "all_access_role",
    "path": ["viewData", "tenant_a"],
    "method": "GET",
    "account_lockout_flag": "true"
}
```

查询访问决策的规则与前面的示例类似，但包括另外一行用于检查该`account_lockout_flag`属性：

```
default allowViewData = false
allowViewData = true {
    input.method == "GET"
    input.path = ["viewData", tenant_id]
    input.tenant_id == tenant_id
    role_permissions := data.roles[input.tenant_id][input.role][_]
    contains(role_permissions, "viewData")
    input.account_lockout_flag == "false"
}
```

此查询返回的授权决定为`false`。这是因为`true`适用于 Bob，而 Rego 规则`allowViewData`拒绝访问，尽管 Bob 的角色和租户`account_lockout_flag attribute`是正确的。