El sistema de Autenticación de Magento funciona mediante un conjunto de reglas de control de acceso llamadas ACL (Access Control List).
Magento nos permite crear nuestros propios conjuntos de reglas para luego asignarlas mediante Roles a un grupo de Usuarios.
Una vez creado los Roles de Usuario podremos asignar permisos de acceso a los diferentes recursos de Magento.
Los Módulos de Magento usan el fichero webapi.xml del directorio etc/ para poder configurar el acceso a estos recursos.
Todos los Roles y Recursos son visibles desde el Bakend. Para ello tenemos que ir a System > Permissions > User Roles
Crendo nuestras propias Reglas ACL
Para crear reglas personalizadas en nuestros módulos primero necesitamos crear un fichero llamado acl.xml en el directorio etc/
Vamos a crear una serie de reglas en nuestro módulo de blog, veamos como funciona:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<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"> <!-- Incluir en el menu Content --> <resource id="Magento_Backend::content" title="Content" translate="title" sortOrder="10"> <!-- Nuestro nuevo conjunto de Reglas --> <resource id="Vendor_News::content_news" title="News" sortOrder="500"> <resource id="Vendor_News::content_news_list" title="List" sortOrder="1" /> <resource id="Vendor_News::content_news_add" title="Add" sortOrder="2"/> <resource id="Vendor_News::content_news_del" title="Delete" sortOrder="3"/> </resource> </resource> <!-- Configuration rules --> <resource id="Magento_Backend::stores"> <resource id="Magento_Backend::stores_settings"> <resource id="Magento_Config::config"> <resource id="Vendor_News::news_config" title="News Section"/> </resource> </resource> </resource> </resource> </resources> </acl> </config> |
Este conjunto de reglas estamos creándolas en el nivel de Content de Magento (Magento_Backend::content).
Ahí incluiremos el conjunto de reglas de acceso a nuestro módulo de Blog. Estas reglas nos permitirán listar, incluir o borrar registros.
Cada Resource podrá tener sus propios Atributos:
- id: Identificador único del resource. Lo podemos localizar en el fichero menu.xml, en el directorio etc/adminhtml/ de nuestro módulo. Sino sabes como hacerlo puedes ver como funciona en este Post.
El valor del atributo resource del elemento <add> es el que vamos a usar para definir la nueva regla.
- title: El nombre del resource que se mostrará en el Backend.
- sortOrder: Ordenación en el árbol respecto al resource al que pertenece.
Recuerda hacer flush de la caché para ver los cambios:
ACL de Configuración
Para poder configurar las reglas de acceso de Configuración tendremos que localizar el fichero system.xml, en el directorio etc/adminhtml/ de nuestro módulo.
Ahí buscaremos el elemento <resource> que estará declarado dentro del elemento <section …> para comprobar el valor que le hemos dado.
1 2 3 |
<section ....> <resource>Vendor_News::news_config</resource> </section> |
Si hemos seguido el ejemplo correctamente nuestro Resource tiene que estar configurado así:
Para comprobar que funciona podremos crear roles (Almacen, Contabilidad, Marketing, etc …) y asignarlos a un usuario para probar que todo funciona como es debido.
Magento nos proporciona un nivel más de seguridad. Para ello tendremos que usar la clase abstracta Magento\Framework\AuthorizationInterface
Con ella podremos validar el usuario logueado contra uno o varias reglas que tengamos asignadas en nuestro ACL.
Si la queremos usar en nuestros controladores lo haremos de la siguiente forma.
1 2 3 |
protected function _isAllowed() { return $this->_authorization->isAllowed('Vendor_News::content_news_del'); } |
Incluyendo el método _isAllowed() en el controlador de borrado de noticias comprobará las reglas en nuestro ACL y permitirá el acceso si el usuario tiene permisos suficientes.
En caso de no tener permiso nos mostrará el siguiente mensaje:
De esta manera podremos incluir nuevas reglas para edición, borrado masivo, etc … y evitamos el tener que ocultar enlaces o campos al usuario ya que es una tarea más tediosa.