

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: filtragem de interface do usuário com OPA e Rego
<a name="opa-ui-filtering-examples"></a>

A flexibilidade do OPA e do Rego suporta a capacidade de filtrar elementos da interface do usuário. O exemplo a seguir demonstra como uma regra parcial de OPA pode tomar decisões de autorização sobre quais elementos devem ser exibidos em uma interface de usuário com RBAC. Esse método é uma das muitas maneiras diferentes de filtrar elementos da interface do usuário com o OPA.

![Filtragem de interface do usuário com OPA e Rego](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/images/opa-example-4.png)


Neste exemplo, um aplicativo web de página única tem quatro botões. Digamos que você queira filtrar a interface de usuário de Bob, Shirley e Alice para que eles possam ver somente os botões que correspondem às suas funções. Quando a interface recebe uma solicitação do usuário, ela consulta uma regra parcial do OPA para determinar quais botões devem ser exibidos na interface do usuário. A consulta passa o seguinte como entrada para a OPA quando Bob (com a função`viewer`) faz uma solicitação para a interface do usuário:

```
{
    "role": "viewer"
}
```

A OPA usa dados externos estruturados para o RBAC para tomar uma decisão de acesso:

```
{
    "roles": {
        "viewer": ["viewUsers", "viewData"],
        "dataViewOnly": ["viewData"],
        "admin": ["viewUsers", "viewData", "updateUsers", "updateData"]
    }
}
```

A regra parcial do OPA usa os dados externos e a entrada para produzir uma lista de ações permitidas:

```
user_permissions[permissions] {
    permissions := data.roles[input.role][_]
}
```

Na regra parcial, o OPA usa o `input.role` especificado como parte da consulta para determinar quais botões devem ser exibidos. Bob tem a função`viewer`, e os dados externos especificam que os espectadores têm duas permissões: `viewUsers` e. `viewData` Portanto, a saída dessa regra para Bob (e para qualquer outro usuário que tenha uma função de visualizador) é a seguinte:

```
{
    "user_permissions": [
        "viewData",
        "viewUsers"
    ]
}
```

A saída para Shirley, quem tem a `dataViewOnly` função, conteria um botão de permissões:. `viewData` A saída para Alice, que tem a `admin` função, conteria todas essas permissões. Essas respostas são retornadas à interface do usuário quando a OPA é consultada. `user_permissions` O aplicativo pode então usar essa resposta para ocultar ou exibir o `viewUsersButton` `viewDataButton``updateUsersButton`,, `updateDataButton` e.