Cómo definir el ACL de nuestros módulos en Magento2

Roles en Magento2

Momento de continuar armando un módulo en Magento2, a través del módulo Barbanet_SampleModule (todo sea para tener a mano en un futuro cercano la mayor cantidad posible de referencias).

En el último post había escrito sobre [cómo agregar las opciones de menú para nuestro módulo. El siguiente paso sería, si vamos a usar roles con restricciones, poder definir si nuestro módulo y sus opciones son accesibles para un rol dado.

El menú de ese último post había quedado así:

Menú personalizado en Magento2

Abro un enorme paréntesis para recordar que el menú con opción en el primer nivel fue sólo con fines explicativos pero, por favor, en Magento2, evitemos llenar de branding Magento (si, yo lo hice también en Magento1).

Ahora si, sabiendo que tenemos ese menú y haciendo la salvedad de lo antes mencionado, vamos a crear un nuevo rol para probar el acceso a nuestro módulo.

Creación de roles en Magento2

Una vez que ingresemos a la opción, como de costumbre veremos la grilla de roles actuales.

Nosotros vamos a crear nuestro primer rol con restricciones.

Creación de roles en Magento2

Asignamos nombre y ahora, los recursos a los cuales se tendrá acceso.

Creación de roles en Magento2

Por supuesto, nuestro módulo no figura. Esto es porque aún, en el código que teníamos hasta la versión 2.5.0 no estaban definidas las reglas ACL.

Para definirlas dichas reglas vamos a crear el archivo acl.xml dentro del directorio etc de nuestro módulo, y le agregaremos el siguiente contenido:

<?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="Barbanet_SampleModule::samplemodule" title="Sample Module" sortOrder="69">
                    <resource id="Barbanet_SampleModule::samplemodule_group" title="Sample Module Group" sortOrder="10">
                        <resource id="Barbanet_SampleModule::samplemodule_first" title="Sample Module First Option" sortOrder="10" />
                    </resource>
                </resource>
            </resource>
        </resources>
    </acl>
</config>

Aquí, básicamente, indicamos cada uno de los resources id especificados en /etc/adminhtml/menu.xml, y lo ubicamos dentro del resource id Magento_Backend::admin (esto porque, como dije, creé un módulo con una opción de menú de primer nivel). Si hubíeramos creado un módulo para CMS, luego de Magento_Backend::admin, el siguiente nodo podría ser Magento_Backend::content.

Ahora si, actualizamos cache y vamos a editar el rol que habíamos creado.

Creación de roles en Magento2

Ahora si tenemos la opción disponible.

Mi nuevo rol de ejemplo queda con los siguientes recursos disponibles.

Creación de roles en Magento2

Si ahora ingreso con el usuario que tiene ese rol, el menú ya estará obedeciendo a la definición del rol.

Menú personalizado en Magento2

El código de ejemplo de este post puede verse en el tag 2.6.0 del módulo.