

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 예제 3: OPA 및 Rego를 사용한 RBAC 및 ABAC에 대한 다중 테넌트 액세스 제어
<a name="opa-abac-rbac-examples"></a>

이전 섹션의 RBAC 예제를 개선하기 위해 사용자에게 속성을 추가할 수 있습니다. 

![\[OPA 및 Rego를 사용하는 RBAC 및 ABAC\]](http://docs.aws.amazon.com/ko_kr/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`가 Bob을 `true` 위한 것이고, Bob이 올바른 역할과 테넌트를 가지고 있지만 Rego 규칙이 액세스를 `allowViewData` 거부하기 때문입니다.