

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 範例 3：具有 OPA 和 Rego 的 RBAC 和 ABAC 的多租戶存取控制
<a name="opa-abac-rbac-examples"></a>

若要增強上一節中的 RBAC 範例，您可以將屬性新增至使用者。 

![RBAC 和 ABAC 搭配 OPA 和 Rego](http://docs.aws.amazon.com/zh_tw/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 `/viewData/tenant_a`的 OPA 查詢輸入的一部分傳遞至資料服務：

```
 {
    "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`。這是因為 `account_lockout_flag attribute``true`適用於 Bob，而 Rego 規則`allowViewData`拒絕存取，雖然 Bob 具有正確的角色和租用戶。