Como criar uma Lista de Controle de Acesso (ACL) personalizada no Magento 2
Tags: php, magento2, tutorial, braziliandevs
Published: 2021-11-22 13:35:50

## Contextualizando

### O que é uma lista de controle de acesso?

O *Access Control List* (Controle de Lista de Acessos) ou ACL são regras que permitem um administrador limitar as permissões de um usuário para autenticação, permitindo o dono da loja refinar as funções para cada papel de usuário.

### Papeis de usuário

As listas de recursos do ACL estão na área do administrador do Magento e são visíveis assim que acessar o caminho `System -> Permissions -> User Roles`. Neste recurso é possível visualizar uma lista em forma de árvore de todos os recursos disponíveis, onde os recursos filhos ficam dentro dos recursos pais.
É possível criar papeis de usuários e selecionar os recursos que cada papel poderá ter acesso, cada usuário ficará limitado aos recursos selecionados do seu papel.

---

## Código para criar o ACL

### acl.xml

Para a criação de novos papéis de usuário no Magento é necessário criar um arquivo chamado `acl.xml` que deve seguir a estrutura de pasta `\{Vendor}\{Module}\etc\acl.xml`. Todo recurso deve iniciar tendo o recurso `Magento_Backend::admin` como raiz, caso não seja filho de outro recurso.

| Atributo  | Descrição                                                                                                                             |
|-----------|---------------------------------------------------------------------------------------------------------------------------------------|
| id        | Define o identificador único que é utilizado na guia.                                                                                 |
| title     | Texto que será exibido na barra de menu.                                                                                              |
| sortOrder | Define a ordem de classificação dos recursos. A ordem é determinada por números crescente, então números menores aparecerão primeiro. |

```xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
    <acl>
        <resources>
            <resource id="Magento_Backend::admin">
                <resource id="{Vendor}_{Module}::{parentResourceId}" title="{Parent Title}" sortOrder="{integer}">
                    <resource id="{Vendor}_{Module}::{featureResourceId}" title="{Feature Title}" sortOrder="{integer}">
                        <resource id="{Vendor}_{Module}::{firstChildResourceId}" title="{First Child Title}" sortOrder="{integer}" />
                        <resource id="{Vendor}_{Module}::{secondChildResourceId}" title="{Second Child Title}" sortOrder="{integer}">
                            <resource id="{Vendor}_{Module}::{firstGrandchildResourceId}" title="{First Grandchild Title}" sortOrder="{integer}" />
                        </resource>
                    </resource>
                </resource>
            </resource>
        </resources>
    </acl>
</config>
```

---

## Finalizando

Valores entre chaves (`{test}`) devem ser alterados na implementação do código.

### Habilitando as alterações

Execute o comando PHP para limpar todos os caches de armazenamento em cache do processos.

```bash
php bin/magento cache:clean
php bin/magento flush
```

### Diretórios e Arquivos

Segue a a lista de diretórios e arquivos que devem ser criados.

```
- app/
  - code/
    - {Vendor}/
        - {Module}/
          - etc/
            - acl.xml
            - module.xml
          - registration.php
          - composer.json

```