

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 1: ABAC básico com permissões verificadas e cedro
<a name="avp-basic-abac-examples"></a>

Neste cenário de exemplo, as Permissões Verificadas da Amazon são usadas para determinar quais usuários têm permissão para acessar informações em um microsserviço fictício de folha de pagamento. Esta seção inclui trechos de código do Cedar para demonstrar como você pode usar o Cedar para processar decisões de controle de acesso. Esses exemplos não pretendem fornecer uma exploração completa dos recursos fornecidos pelo Cedar e pelo Verified Permissions. Para uma visão geral mais completa do Cedar, consulte a documentação do [Cedar](https://docs.cedarpolicy.com/).

No diagrama a seguir, gostaríamos de aplicar duas regras gerais de negócios associadas ao `viewSalary` `GET` método: *os funcionários podem ver seu próprio salário e os funcionários podem ver o salário* *de qualquer pessoa que se reporte a eles*. Você pode aplicar essas regras de negócios usando políticas de permissões verificadas.

![Exemplo de uma implementação básica de ABAC com Amazon Verified Permissions e Cedar para implementar uma PDP](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/images/avp-example-1.png)


*Os funcionários podem ver seu próprio salário.*

Em Cedar, a construção básica é uma *entidade*, que representa um principal, uma ação ou um recurso. Para fazer uma solicitação de autorização e iniciar uma avaliação com uma política de permissões verificadas, você precisa fornecer um *principal,* uma *ação*, um *recurso* e uma *lista de entidades.*
+ O principal (`principal`) é o usuário ou função logado.
+ A ação (`action`) é a operação que é avaliada pela solicitação.
+ O recurso (`resource`) é o componente que a ação está acessando.
+ A lista de entidades (`entityList`) contém todas as entidades necessárias para avaliar a solicitação.

Para satisfazer a regra de negócios, *os funcionários podem ver seu próprio salário*, você pode fornecer uma política de permissões verificadas, como a seguinte.

```
permit (
    principal,
    action == Action::"viewSalary",
    resource
)
when {
    principal == resource.owner
};
```

Essa política avalia `ALLOW` se o `Action` é `viewSalary` e o recurso na solicitação têm um proprietário de atributo igual ao principal. Por exemplo, se Bob for o usuário conectado que solicitou o relatório salarial e também for o proprietário do relatório salarial, a política será avaliada como. `ALLOW`

A solicitação de autorização a seguir é enviada às Permissões verificadas para ser avaliada pelo exemplo de política. Neste exemplo, Bob é o usuário logado que faz a `viewSalary` solicitação. Portanto, Bob é o principal do tipo de entidade`Employee`. A ação que Bob está tentando realizar é `viewSalary,` e o recurso que `viewSalary` será exibido é `Salary-Bob` com o tipo`Salary`. Para avaliar se Bob pode visualizar o `Salary-Bob` recurso, você precisa fornecer uma estrutura de entidade que vincule o tipo `Employee` com um valor de `Bob` (o principal) ao atributo proprietário do recurso que tem o tipo`Salary`. Você fornece essa estrutura em um`entityList`, em que os atributos associados `Salary` incluem um proprietário, que especifica um `entityIdentifier` que contém o tipo `Employee` e o valor`Bob`. As permissões verificadas comparam o `principal` fornecido na solicitação de autorização com o `owner` atributo associado ao `Salary` recurso para tomar uma decisão.

```
{
  "policyStoreId": "PAYROLLAPP_POLICYSTOREID",
  "principal": {
    "entityType": "PayrollApp::Employee",
    "entityId": "Bob"
  },
  "action": {
    "actionType": "PayrollApp::Action",
    "actionId": "viewSalary"
  },
  "resource": {
    "entityType": "PayrollApp::Salary",
    "entityId": "Salary-Bob"
  },
  "entities": {
    "entityList": [
      {
        "identifier": {
          "entityType": "PayrollApp::Salary",
          "entityId": "Salary-Bob"
        },
        "attributes": {
          "owner": {
            "entityIdentifier": {
              "entityType": "PayrollApp::Employee",
              "entityId": "Bob"
            }
          }
        }
      },
      {
        "identifier": {
          "entityType": "PayrollApp::Employee",
          "entityId": "Bob"
        },
        "attributes": {}
      }
    ]
  }
}
```

A solicitação de autorização para Permissões verificadas retorna o seguinte como saída, em que o atributo `decision` é `ALLOW` ou`DENY`.

```
{
    "determiningPolicies": 
        [ 
            {
                "determiningPolicyId": "PAYROLLAPP_POLICYSTOREID" 
            }
        ],
    "decision": "ALLOW",
    "errors": [] 
}
```

Nesse caso, como Bob estava tentando ver seu próprio salário, a solicitação de autorização enviada para Permissões verificadas é avaliada como. `ALLOW` No entanto, nosso objetivo era usar as Permissões Verificadas para aplicar duas regras de negócios. A regra de negócios que afirma o seguinte também deve ser verdadeira:

*Os funcionários podem ver o salário de qualquer pessoa que se reporte a eles.*

Para satisfazer essa regra de negócios, você pode fornecer outra política. A política a seguir avalia `ALLOW` se a ação é `viewSalary` e se o recurso na solicitação tem um atributo `owner.manager` igual ao principal. Por exemplo, se Alice for a usuária conectada que solicitou o relatório salarial e Alice for a gerente do proprietário do relatório, a política será avaliada como. `ALLOW`

```
permit (
    principal,
    action == Action::"viewSalary",
    resource
)
when {
    principal == resource.owner.manager
};
```

A solicitação de autorização a seguir é enviada às Permissões verificadas para ser avaliada pelo exemplo de política. Neste exemplo, Alice é a usuária logada que faz a `viewSalary` solicitação. Portanto, Alice é a principal e a entidade é do tipo`Employee`. A ação que Alice está tentando realizar é`viewSalary`, e o recurso que `viewSalary` será exibido é do tipo `Salary` com um valor de`Salary-Bob`. Para avaliar se Alice pode visualizar o `Salary-Bob` recurso, você precisa fornecer uma estrutura de entidade que vincule o tipo `Employee` a um valor de `Alice` ao `manager` atributo, que deve então ser associado ao `owner` atributo do tipo `Salary` com um valor de`Salary-Bob`. Você fornece essa estrutura em um`entityList`, em que os atributos associados `Salary` incluem um proprietário, que especifica um `entityIdentifier` que contém o tipo `Employee` e o valor`Bob`. As permissões verificadas primeiro verificam o `owner` atributo, que avalia o tipo `Employee` e o valor`Bob`. Em seguida, as Permissões verificadas avaliam o `manager` atributo associado `Employee` e o comparam com o principal fornecido para tomar uma decisão de autorização. Nesse caso, a decisão é `ALLOW` porque os `resource.owner.manager` atributos `principal ` e são equivalentes.

```
{
  "policyStoreId": "PAYROLLAPP_POLICYSTOREID",
  "principal": {
    "entityType": "PayrollApp::Employee",
    "entityId": "Alice"
  },
  "action": {
    "actionType": "PayrollApp::Action",
    "actionId": "viewSalary"
  },
  "resource": {
    "entityType": "PayrollApp::Salary",
    "entityId": "Salary-Bob"
  },
  "entities": {
    "entityList": [
      {
        "identifier": {
          "entityType": "PayrollApp::Employee",
          "entityId": "Alice"
        },
        "attributes": {
          "manager": {
            "entityIdentifier": {
              "entityType": "PayrollApp::Employee",
              "entityId": "None"
            }
          }
        },
        "parents": []
      },
      {
        "identifier": {
          "entityType": "PayrollApp::Salary",
          "entityId": "Salary-Bob"
        },
        "attributes": {
          "owner": {
            "entityIdentifier": {
              "entityType": "PayrollApp::Employee",
              "entityId": "Bob"
            }
          }
        },
        "parents": []
      },
      {
        "identifier": {
          "entityType": "PayrollApp::Employee",
          "entityId": "Bob"
        },
        "attributes": {
          "manager": {
            "entityIdentifier": {
              "entityType": "PayrollApp::Employee",
              "entityId": "Alice"
            }
          }
        },
       "parents": []
      }
    ]
  }
}
```

Até agora, neste exemplo, fornecemos as duas regras de negócios associadas ao `viewSalary` método: *os funcionários podem ver seu próprio salário e os funcionários podem ver o salário* *de qualquer pessoa que se reporte a eles*. As permissões verificadas são políticas para satisfazer as condições de cada regra de negócios de forma independente. Você também pode usar uma única política de Permissões Verificadas para satisfazer as condições de ambas as regras de negócios:

*Os funcionários podem ver seu próprio salário e o salário de qualquer pessoa que se reporte a eles.*

Quando você usa a solicitação de autorização anterior, a política a seguir avalia `ALLOW` se a ação é `viewSalary` e se o recurso na solicitação tem um atributo `owner.manager` igual ao `principal` ou um atributo `owner` igual ao`principal`. 

```
permit (
    principal,
    action == PayrollApp::Action::"viewSalary",
    resource
)
when {
    principal == resource.owner.manager ||
    principal == resource.owner
};
```

Por exemplo, se Alice for a usuária conectada que solicita o relatório salarial e se Alice for a gerente do proprietário ou a proprietária do relatório, a política será avaliada como. `ALLOW`

Para obter mais informações sobre o uso de operadores lógicos com políticas do Cedar, consulte a documentação do [Cedar](https://docs.cedarpolicy.com/policies/syntax-operators.html).