У розділі попередня стаття ми пояснили, як налаштувати та розмежувати права доступу для користувачів адміністративної панелі Magento 2. У цій статті ви дізнаєтеся, як створювати власні правила доступу (Ресурси ролей).

User Role Reasources in Magento 2

Вам потрібно створити файл ACL (ACL - Список контролю доступу) у папці Basic модуль :

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 ви побачите нові елементи на вкладці Ресурси ролей на сторінці редагування Ролі користувачів .

Перші два ресурси (ключ1, ключ2) стосуються елементів меню. Їхня ієрархія може відповідати ієрархії меню. Ці ресурси слід вказати в 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="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>

Третій ресурс (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.