

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Exemplo 4: Controle de acesso multilocatário com RBAC e ABAC
<a name="avp-mt-abac-rbac-examples"></a>

Para aprimorar o exemplo de RBAC na seção anterior, você pode adicionar atributos aos usuários para criar uma abordagem híbrida RBAC-ABAC para controle de acesso multilocatário. Esse exemplo inclui as mesmas funções do exemplo anterior, mas adiciona o atributo de usuário `account_lockout_flag` e o parâmetro de contexto`uses_mfa`. O exemplo também adota uma abordagem diferente para implementar o controle de acesso multilocatário usando o RBAC e o ABAC, e usa um repositório de políticas compartilhado em vez de um armazenamento de políticas diferente para cada inquilino. 

![Exemplo de controle de acesso multilocatário com RBAC, ABAC, Amazon Verified Permissions e Cedar](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/images/avp-example-4.png)


Este exemplo representa uma solução SaaS multilocatária na qual você precisa fornecer decisões de autorização para o Locatário A e o Locatário B, semelhante ao exemplo anterior.

Para implementar o recurso de bloqueio de usuário, o exemplo adiciona o `account_lockout_flag` atributo à `User` entidade principal na solicitação de autorização. Esse sinalizador bloqueia o acesso do usuário ao sistema e concede `DENY` todos os privilégios ao usuário bloqueado. O `account_lockout_flag` atributo está associado à `User` entidade e está em vigor `User` até que o sinalizador seja revogado ativamente em várias sessões. O exemplo usa a `when` condição para avaliar`account_lockout_flag`.

O exemplo também adiciona detalhes sobre a solicitação e a sessão. As informações de contexto especificam que a sessão foi autenticada usando a autenticação multifator. Para implementar essa validação, o exemplo usa a `when` condição para avaliar o `uses_mfa` sinalizador como parte do campo de contexto. Para obter mais informações sobre as melhores práticas para adicionar contexto, consulte a [documentação do Cedar](https://docs.cedarpolicy.com/auth/entities-syntax.html).

```
permit (
    principal in MultitenantApp::Role::"allAccessRole",
    action in [
        MultitenantApp::Action::"viewData",
        MultitenantApp::Action::"updateData"
    ],
    resource
)
when {
    principal.account_lockout_flag == false &&
    context.uses_mfa == true &&
    resource in principal.Tenant
};
```

Essa política impede o acesso aos recursos, a menos que o recurso esteja no mesmo grupo que o `Tenant` atributo do principal solicitante. Essa abordagem para manter o isolamento de inquilinos é conhecida como abordagem de *um repositório de políticas compartilhado para vários locatários*. Para obter mais informações sobre as considerações de design de permissões verificadas para aplicativos SaaS multilocatários, consulte a seção Considerações sobre design de [permissões verificadas para vários locatários](avp-design-considerations.md).

A política também garante que o diretor seja membro `allAccessRole` e restringe as ações de `viewData` e. `updateData` Além disso, essa política verifica se `account_lockout_flag` é `false` e se o valor do contexto de é `uses_mfa` avaliado como. `true`

Da mesma forma, a política a seguir garante que o principal e o recurso estejam associados ao mesmo inquilino, o que impede o acesso entre inquilinos. Essa política também garante que o diretor seja membro `viewDataRole` e restringe as ações a. `viewData` Além disso, verifica se o `account_lockout_flag` é `false` e se o valor do contexto para é `uses_mfa` avaliado como. `true`

```
permit (
    principal in MultitenantApp::Role::"viewDataRole",
    action == MultitenantApp::Action::"viewData",
    resource
)
when {
    principal.account_lockout_flag == false &&
    context.uses_mfa == true &&
    resource in principal.Tenant
};
```

A terceira política é semelhante à anterior. A política exige que o recurso seja membro do grupo que corresponde à entidade representada por`principal.Tenant`. Isso garante que tanto o principal quanto o recurso estejam associados ao Locatário B, o que impede o acesso entre inquilinos. Essa política garante que o diretor seja membro `updateDataRole` e restringe as ações a. `updateData` Além disso, essa política verifica se o `account_lockout_flag` é `false` e se o valor do contexto para é `uses_mfa` avaliado como. `true`

```
permit (
    principal in MultitenantApp::Role::"updateDataRole",
    action == MultitenantApp::Action::"updateData",
    resource
)
when {
    principal.account_lockout_flag == false &&
    context.uses_mfa == true &&
    resource in principal.Tenant
};
```

A solicitação de autorização a seguir é avaliada pelas três políticas discutidas anteriormente nesta seção. Nessa solicitação de autorização, o principal do tipo `User` e com um valor de `Alice` faz uma `updateData` solicitação com a função`allAccessRole`. `Alice`tem o atributo `Tenant` cujo valor é`Tenant::"TenantA"`. A ação `Alice` que está tentando executar é `updateData,` e o recurso ao qual ela será aplicada é `SampleData` do tipo`Data`. `SampleData`tem `TenantA` como entidade controladora. 

De acordo com a primeira `<DATAMICROSERVICE_POLICYSTOREID>` política no repositório de políticas, `Alice` pode executar a `updateData` ação no recurso, supondo que as condições na `when` cláusula da política sejam atendidas. A primeira condição exige que o `principal.Tenant` atributo seja avaliado`TenantA`. A segunda condição exige que o `account_lockout_flag` atributo do principal seja`false`. A condição final exige que `uses_mfa` o contexto seja`true`. Como todas as três condições foram atendidas, a solicitação retorna uma `ALLOW` decisão.

```
{
  "policyStoreId": "DATAMICROSERVICE_POLICYSTORE",
  "principal": {
      "entityType": "MultitenantApp::User",
      "entityId": "Alice"
  },
  "action": {
      "actionType": "MultitenantApp::Action",
      "actionId": "updateData"
  },
  "resource": {
      "entityType": "MultitenantApp::Data",
      "entityId": "SampleData"
  },
  "context": {
    "contextMap": {
        "uses_mfa": {
            "boolean": true
        }
    }
  },
  "entities": {
    "entityList": [
      {
        "identifier": {
            "entityType": "MultitenantApp::User",
            "entityId": "Alice"
        },
        "attributes": {
            {
                "account_lockout_flag": {
                    "boolean": false
                },
                "Tenant": {
                   "entityIdentifier": {
                        "entityType":"MultitenantApp::Tenant",
                        "entityId":"TenantA"
                   }
                }
            }
        },
        "parents": [
            {
                "entityType": "MultitenantApp::Role",
                "entityId": "allAccessRole"
            }
        ]
        },
     {
        "identifier": {
            "entityType": "MultitenantApp::Data",
            "entityId": "SampleData"
        },
        "attributes": {},
        "parents": [
            {
                "entityType": "MultitenantApp::Tenant",
                "entityId": "TenantA"
            }
        ]
      }
    ]
  }
}
```