Magento ACL: Control de permisos de administración

por David Abad
Magento ACL

Magento proporciona un sistema de Control de Acceso (ACL) que administra los roles y permisos de usuarios administradores, restringiendo sus acciones. Este sistema ofrece la posibilidad de limitar el acceso a áreas concretas de la administración y asignar roles específicos como marketing, negocio, técnicos, etc.

Gestión de roles y permisos

El sistema de control de acceso (ACL) de Magento permite definir diferentes grupos de usuarios administradores pensados para clasificar estos usuarios por roles, pudiendo asignar permisos específicos para las acciones necesarias en cada caso según su área de un negocio (marketing, negocio, técnicos, etc.).

Estos grupos de usuarios pueden ser gestionados desde la sección System > Permissions > User Roles del administrador de Magento, pudiendo crear nuevos grupos o editar los existentes:

Magento ACL: Gestión de roles

p …
ロe 属昌… …… ド に

Magento ACL - Role resources

T ロロロロロに

Esta solución para la gestión de usuarios administradores y permisos tiene una gran versatilidad, ya que permite definir y modificar fácilmente las acciones permitidas por cada rol de usuario, de modo que no todos los usuarios puedan visualizar las mismas secciones o realizar las mismas acciones. 

Además,  es una una solución muy fácilmente escalable ya que, al desarrollar una nueva funcionalidad para Magento, es muy sencillo incluir un nuevo recurso ACL. De este modo, únicamente los usuarios administradores con permisos sobre dicho recurso podrán acceder al nuevo desarrollo implementado.  

Definir nuevos recursos ACL

Magento permite extender fácilmente el árbol de recursos ACL de modo que, cuando realizamos un nuevo desarrollo, podemos definir nuevos recursos ACL que nos servirán para determinar cuando un usuario tiene permisos (o no) para realizar una acción.

 Para definir un nuevo recurso ACL debemos crear un fichero <Mi Modulo>/etc/acl.xml, indicando los recursos  con el siguiente formato:

<?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="MiVendor_MiModulo::mi_modulo" title="Mi módulo">
                    <resource id="MiVendor_MiModulo::mi_recurso" title="Mi recurso">
                        <resource id="MiVendor_MiModulo::mi_subrecurso" title="Mi subrecurso" />
                    </resource>
                </resource>
            </resource>
        </resources>
    </acl>
</config>

Magento ACL: Nuevo recurso

Implementar control de permisos ACL

La gestión de permisos ACL de Magento permite controlar si un usuario administrador tiene los privilegios adecuados para realizar una acción desde diferentes puntos.

Controlar permisos desde controladores

Las clases de los controladores que atienden las acciones del administrador de Magento permiten incluir una constante (ADMIN_RESOURCE) donde indicar el recurso ACL para la gestión de permisos. De modo que, solo los usuarios con permisos sobre dicho recurso podrán ejecutar el controlador.

 Esta constante es utilizada por la función \Magento\Backend\App\AbstractAction::_isAllowed de la clase abstracta de la que heredan los controladores del administrador. Por lo que solo será necesario incluir esta constante para que se realice el control de permisos necesario:

<?php

namespace MiVendor\MiModulo\Controller\Adminhtml;

class MiAccion extends \Magento\Backend\App\AbstractAction
{
    const ADMIN_RESOURCE = 'MiVendor_MiModulo::mi_recurso';
}
Controlar permisos desde el menú

Los diferentes elementos del menú del administrador de Magento llevan asociado un recurso ACL. De modo que, únicamente los administradores con permisos sobre dicho recurso, pueden visualizar el menú.

Para controlar la visibilidad de un menú, se debe indicar el recurso ACL correspondiente en la propiedad “resource” del fichero: <MiModulo>/etc/adminhtml/menu.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd">
    <menu>
        <add id="MiVendor_MiModulo::mi_menu" module="MiVendor_MiModulo" resource="MiVendor_MiModulo::mi_recurso" parent="..." action="..." />
    </menu>
</config>
Controlar permisos desde Ui-Components

El administrador de Magento está formado principalmente por dos tipos de componente: Formularios y Listados.

Estos componentes también permiten la gestión de permisos ACL, definiendo el recurso correspondiente en sus ficheros XML:

<?xml version="1.0" encoding="UTF-8"?>
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <dataSource name="mi_modulo_mi_listado_datasource" component="Magento_Ui/js/grid/provider">
        <aclResource>MiVendor_MiModulo::mi_recurso</aclResource>
        [...]
    </dataSource>
    [...]
</listing>
Controlar permisos desde API

La gestión de permisos ACL de Magento también permite controlar las acciones llamadas a través de API. De este modo, únicamente los usuarios administradores identificados y con permisos sobre el recurso indicado podrán tener acceso al servicio definido.

Para ello, se debe indicar el recurso correspondiente al definir el servicio en el fichero <Mi Modulo>/etc/webapi.xml:

<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
    <route url="/V1/mi-modulo/mi-accion" method="GET">
        <service class="MiVendor\MiModulo\Api\MiRepositorio" method="miAccion"/>
        <resources>
            <resource ref="MiVendor_MiModulo::mi_recurso"/>
        </resources>
    </route>
</routes>
Controlar permisos desde cualquier otro punto

Magento también permite comprobar si un usuario administrador cuenta con permisos sobre un recurso ACL desde cualquier otro punto de nuestro código, utilizando la función: \Magento\Framework\AuthorizationInterface::isAllowed.

 
<?php

declare(strict_types=1);

namespace MiVendor\MiModulo\Model;

class MiClase
{
    public function __construct(
        protected \Magento\Framework\AuthorizationInterface $authorization
    ) {}

    public function execute(): void
    {
        if (!$this->authorization->isAllowed('MiVendor_MiModulo::mi_recurso')) {
            return;
        }
        [...]
    }
}

Déjanos tu email para recibir contenido interesante en tu bandeja de entrada, cada mes.

¡No hacemos spam!

Otros artículos