Skip to content
intermediate Phase 51 · Admin Basics

ACL Permissions

Resource tree, role management, permission checks in controllers, and ACL configuration

45m
0 problems
Topic Progress 0%

ACL Resource Tree

ACL Configuration

<!-- app/code/Vendor/Module/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">
                <!-- Backend module resources -->
                <resource id="Magento_Backend::stores">
                    <resource id="Magento_Backend::stores_settings">
                        <resource id="Magento_Config::config"/>
                    </resource>
                </resource>

                <!-- Sales module resources -->
                <resource id="Magento_Sales::sales">
                    <resource id="Magento_Sales::orders"/>
                    <resource id="Magento_Sales::invoices"/>
                    <resource id="Magento_Sales::shipments"/>
                    <resource id="Magento_Sales::creditmemos"/>
                </resource>

                <!-- Custom module resources -->
                <resource id="Vendor_Module::module">
                    <resource id="Vendor_Module::items">
                        <resource id="Vendor_Module::items_view"/>
                        <resource id="Vendor_Module::items_edit"/>
                        <resource id="Vendor_Module::items_delete"/>
                    </resource>
                    <resource id="Vendor_Module::settings"/>
                </resource>
            </resource>
        </resources>
    </acl>
</config>

Resource Hierarchy

Magento_Backend::admin
├── Magento_Backend::stores
│   └── Magento_Backend::stores_settings
│       └── Magento_Config::config
├── Magento_Sales::sales
│   ├── Magento_Sales::orders
│   ├── Magento_Sales::invoices
│   └── Magento_Sales::shipments
└── Vendor_Module::module
    ├── Vendor_Module::items
    │   ├── Vendor_Module::items_view
    │   ├── Vendor_Module::items_edit
    │   └── Vendor_Module::items_delete
    └── Vendor_Module::settings

Role Management

Admin Role Model

namespace Magento\Authorization\Model\Role;

class Role extends \Magento\Framework\Model\AbstractModel
{
    public function getName(): string
    {
        return $this->getData('role_name');
    }

    public function getRoleType(): string
    {
        return $this->getData('role_type');
    }

    public function getPermissions(): array
    {
        return $this->getData('permissions');
    }
}

Creating Roles

namespace Vendor\Module\Service;

class RoleManager
{
    public function __construct(
        private \Magento\Authorization\Model\RoleFactory $roleFactory,
        private \Magento\Authorization\Model\RulesFactory $rulesFactory
    ) {}

    public function createRole(string $name, array $permissions): void
    {
        $role = $this->roleFactory->create();
        $role->setName($name);
        $role->setRoleType('A'); // A = Admin
        $role->save();

        // Set permissions
        $rules = $this->rulesFactory->create();
        $rules->setRoleId($role->getId());
        $rules->setPermission('allow');
        $rules->setResources($permissions);
        $rules->save();
    }
}

Permission Checks

Check Permissions in Controller

namespace Vendor\Module\Controller\Adminhtml\Item;

class Edit extends \Magento\Backend\App\Action
{
    protected function _isAllowed(): bool
    {
        return $this->_authorization->isAllowed('Vendor_Module::items_edit');
    }
}

Check Permissions in Block

namespace Vendor\Module\Block\Adminhtml\Item;

class Edit extends \Magento\Backend\Block\Widget\Form\Container
{
    protected function _construct()
    {
        parent::_construct();

        $this->_objectId = 'id';
        $this->_blockGroup = 'Vendor_Module';
        $this->_controller = 'adminhtml_item';
        $this->_mode = 'edit';

        $this->_addButton('save_and_continue', [
            'class' => 'save',
            'label' => __('Save and Continue Edit'),
            'onclick' => 'setLocation(\'' . $this->_getSaveAndContinueUrl() . '\')',
        ]);
    }

    private function _getSaveAndContinueUrl(): string
    {
        return $this->getUrl('*/*/save', [
            'id' => $this->getRequest()->getParam('id'),
            '_current' => true,
        ]);
    }
}

Permission Check in Service

namespace Vendor\Module\Service;

class PermissionAwareService
{
    public function __construct(
        private \Magento\Framework\Authorization\AuthorizationInterface $authorization
    ) {}

    public function performAction(string $resource): void
    {
        if (!$this->authorization->isAllowed($resource)) {
            throw new \Magento\Framework\Exception\AuthorizationException(
                __('You do not have permission to perform this action.')
            );
        }

        // Perform action
    }
}

ACL in UI Components

Grid ACL Resource

<!-- Grid data source with ACL -->
<dataSource name="custom_data_source">
    <dataProvider class="Magento\Ui\Model\DataProvider" name="custom_data_source">
        <aclResource>Vendor_Module::items_view</aclResource>
    </dataProvider>
</dataSource>

Column Visibility Based on ACL

// Conditionally show columns based on permissions
namespace Vendor\Module\Ui\Component\Column;

class SecureColumn extends \Magento\Ui\Component\Listing\Columns\Column
{
    public function __construct(
        \Magento\Framework\View\Element\UiComponent\ContextInterface $context,
        array $components = [],
        array $data = [],
        private \Magento\Framework\Authorization\AuthorizationInterface $authorization = null
    ) {
        parent::__construct($context, $components, $data);
    }

    public function isShown(): bool
    {
        return $this->authorization->isAllowed('Vendor_Module::items_view');
    }
}

Mass Action ACL

<!-- Mass action with ACL -->
<massaction name="listing_massaction">
    <action name="delete">
        <aclResource>Vendor_Module::items_delete</aclResource>
        <settings>
            <url path="vendor_module/item/massDelete"/>
        </settings>
    </action>
</massaction>

Quiz

1. What is the ACL resource tree?

Question 1 options

2. How do you check if a user has permission?

Question 2 options

3. What does role_type 'A' represent?

Question 3 options

Flashcards

Question

ACL resource tree purpose?

Answer

Hierarchical permission structure for admin resources

Question

How to check permission?

Answer

_authorization->isAllowed('Vendor_Module::resource')

Question

Admin role type?

Answer

role_type = 'A' for admin roles

Question

Where is ACL configured?

Answer

etc/acl.xml in each module

Revision Notes

Key Takeaways

  • 1. ACL resources form a hierarchical tree in etc/acl.xml
  • 2. Roles are assigned sets of ACL permissions
  • 3. Controllers check permissions via _isAllowed() method
  • 4. Services can use AuthorizationInterface for permission checks
  • 5. Grids and UI components can restrict access via aclResource

Interview Tips

  • Explain the ACL resource hierarchy and inheritance
  • Describe how to check permissions at different layers
  • Discuss role management and permission assignment

Cheat Sheet

ACL:
  Resource: Vendor_Module::resource_name
  Tree: etc/acl.xml
  Check: _authorization->isAllowed()

Roles:
  type 'A' = Admin
  Permissions assigned via Rules model

Layers:
  Controller: _isAllowed()
  Service: AuthorizationInterface
  UI: aclResource attribute