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:
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>
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;
}
[...]
}
}