У попередній статті ми розповіли як налаштовувати права доступу для користувачів адмін-панелі Magento 2. У цій статті ми розглянемо, як створювати власні правила доступу (Role Resources).

User Role Reasources in Magento 2

Для цього необхідно у папці вашого модуля створити 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.