У попередній статті ми розповіли як налаштовувати права доступу для користувачів адмін-панелі Magento 2. У цій статті ми розглянемо, як створювати власні правила доступу (Role Resources).
Для цього необхідно у папці вашого модуля створити ACL-файл (ACL - Access control list):
etc/acl.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="Magento_Backend::content">
<resource id="VendorName_ModuleName::key1" title="Title 1" sortOrder="10">
<resource id="VendorName_ModuleName::key2" title="Title 2" sortOrder="10" />
</resource>
</resource>
<resource id="Magento_Backend::stores">
<resource id="Magento_Backend::stores_settings">
<resource id="Magento_Config::config">
<resource id="VendorName_ModuleName::key3" title="Title 3" />
</resource>
</resource>
</resource>
</resource>
</resources>
</acl>
</config>
Очистивши Magento кеш, побачите нові пункти у вкладці Role Resources на сторінці редагування User Roles.
Перші два ресурси (key1, key2) стосуються елементів меню. Їхня ієрархія може відповідати ієрархії меню. Ці ресурси варто вказати у файлі menu.xml (атрибут resource), наприклад:
<?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="VendorName_ModuleName::key1" title="Title 1" module="VendorName_ModuleName" parent="OtherVendorName_OtherModuleName::content" sortOrder="10" resource="VendorName_ModuleName::key1"/>
<add id="VendorName_ModuleName::key2" title="Title 2" module="VendorName_ModuleName" parent="VendorName_ModuleName::key1" sortOrder="10" action="path/controllerName" resource="VendorName_ModuleName::key2"/>
</menu>
</config>
Детальніше, як додати новий пункт до меню адмін-панелі Magento 2.
Третій ресурс (key3), доданий для секції сторінки налаштувань Magento 2 (Stores > Configuration). Зверніть увагу, що батьківським елементом для key3 є саме Magento_Config::config. Для того, щоб він запрацював його необхідно вказати у файл system.xml, наприклад:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
<system>
<tab id="tab_id" translate="label" sortOrder="110">
<label>My Tab</label>
</tab>
<section id="section_id" translate="label" type="text" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="1">
<class>separator-top</class>
<label>My Section</label>
<tab>tab_id</tab>
<resource>VendorName_ModuleName::key3</resource>
....
Після зміни конфігураційних XML-файлів, очистіть кеш Magento 2.
Якщо ваш модуль використовує власні контролери адмін-панелі, вкажіть для них право доступу. У класі контролера додайте константу із назвою ACL ключа, наприклад:
const ADMIN_RESOURCE = 'VendorName_ModuleName::key1';
Також ви можете обмежувати доступ до специфічних блоків адмін-панелі за допомогою методу \Magento\Framework\Authorization::isAllowed, наприклад:
if ($this->_authorization->isAllowed('VendorName_ModuleName::key1')) {
//є доступ
} else {
//доступ заборонений
}
У прикладах ми створюємо модуль для FAQ. Змінений код модуля можна переглянути на GitHub.