模块实战:配置文件 acl.xml

·

·

一、Magento 2 中 ACL 简介

在 Magento 2 系统中,访问控制列表(ACL)扮演着至关重要的角色。它用于定义系统中不同用户角色对资源的访问权限。通过合理配置 acl.xml 文件,我们可以精确地控制管理员用户对不同模块、菜单以及操作的访问权限。

例如,我们可能希望只有特定的管理员角色能够访问某些敏感的配置页面或者执行特定的后台操作。这就需要我们在 acl.xml 文件中进行详细的权限设置。

二、acl.xml 文件的基本结构

acl.xml 文件遵循特定的 XML 结构来定义访问控制规则。以下是一个简单的 acl.xml 示例:

收起

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="Vendor_Module::module" title="My Module" sortOrder="10">
                    <resource id="Vendor_Module::view" title="View" sortOrder="10" />
                    <resource id="Vendor_Module::edit" title="Edit" sortOrder="20" />
                </resource>
            </resource>
        </resources>
    </acl>
</config>

在这个示例中,我们定义了一个新的模块资源(Vendor_Module),并且在这个模块下又定义了查看(view)和编辑(edit)两个子资源。

三、在自定义模块中定义 ACL

假设我们正在开发一个名为 “CustomModule” 的自定义模块。我们可以在模块的 etc 目录下创建 acl.xml 文件。

以下是在自定义模块中定义 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="CustomModule::custom_module" title="Custom Module" sortOrder="20">
                    <resource id="CustomModule::custom_action_1" title="Action 1" sortOrder="10" />
                    <resource id="CustomModule::custom_action_2" title="Action 2" sortOrder="20" />
                </resource>
            </resource>
        </resources>
    </acl>
</config>

在这个示例中,我们为 “CustomModule” 模块定义了两个自定义操作(custom_action_1 和 custom_action_2)的访问权限。

四、基于角色的权限分配

Magento 2 允许我们根据不同的管理员角色来分配权限。我们可以在后台的用户角色管理界面中看到我们在 acl.xml 文件中定义的资源。

例如,我们可以创建一个新的管理员角色,并为这个角色分配对我们自定义模块中特定资源的访问权限。假设我们有一个名为 “CustomRole” 的角色,我们可以在后台将 “CustomModule::custom_action_1” 的权限分配给这个角色。

五、通过编程方式检查权限

在 PHP 代码中,我们可以使用 Magento 2 的授权服务来检查当前用户是否具有特定的权限。

以下是一个在控制器中检查权限的示例:

收起

php

复制

<?php

namespace Vendor\CustomModule\Controller\Adminhtml;

use Magento\Backend\App\Action;
use Magento\Framework\App\Action\HttpGetActionInterface;
use Magento\Framework\Controller\ResultFactory;

class Index extends Action implements HttpGetActionInterface
{
    protected function _isAllowed()
    {
        return $this->_authorization->isAllowed('CustomModule::custom_action_1');
    }

    public function execute()
    {
        $resultPage = $this->resultFactory->create(ResultFactory::TYPE_PAGE);
        // 其他业务逻辑
        return $resultPage;
    }
}

在这个示例中,在控制器的 “_isAllowed” 方法中检查当前用户是否具有 “CustomModule::custom_action_1” 的权限,如果没有权限,用户将被重定向到禁止访问的页面。

六、复杂 ACL 结构的处理

在实际的项目中,我们可能会遇到更复杂的 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="ComplexModule::complex_module" title="Complex Module" sortOrder="30">
                    <resource id="ComplexModule::sub_module_1" title="Sub Module 1" sortOrder="10">
                        <resource id="ComplexModule::action_1" title="Action 1" sortOrder="10" />
                        <resource id="ComplexModule::action_2" title="Action 2" sortOrder="20" />
                    </resource>
                    <resource id="ComplexModule::sub_module_2" title="Sub Module 2" sortOrder="20">
                        <resource id="ComplexModule::action_3" title="Action 3" sortOrder="10" />
                    </resource>
                </resource>
            </resource>
        </resources>
    </acl>
</config>

七、验证 ACL 配置的正确性

虽然 Magento 2 在加载 acl.xml 文件时会进行一些基本的验证,但我们也可以通过一些额外的测试来确保我们的 ACL 配置是正确的。

我们可以编写一些单元测试来模拟不同的用户角色和权限检查场景,以验证我们的 ACL 配置是否符合预期。

例如:

收起

php

复制

<?php

namespace Vendor\CustomModule\Test\Unit;

use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
use Magento\Backend\App\Action\Context;
use Magento\Framework\AuthorizationInterface;
use Vendor\CustomModule\Controller\Adminhtml\Index;

class IndexTest extends \PHPUnit\Framework\TestCase
{

    public function testIsAllowed()
    {
        $authorizationMock = $this->getMockBuilder(AuthorizationInterface::class)
            ->getMock();

        $context = (new ObjectManager($this))->getObject(Context::class, [
            'authorization' => $authorizationMock
        ]);

        $controller = new Index($context);

        $authorizationMock->expects($this->once())
            ->method('isAllowed')
            ->with('CustomModule::custom_action_1')
            ->willReturn(true);

        $this->assertTrue($controller->_isAllowed());
    }
}

八、总结与观点

在 Magento 2 系统中,acl.xml 文件是实现访问控制的关键配置文件。通过合理地构建和配置 acl.xml,我们可以有效地管理管理员用户的权限,提高系统的安全性和可管理性。

在开发过程中,我们应该仔细设计 ACL 结构,充分考虑到不同模块、不同操作之间的权限关系。同时,通过编程方式检查权限和进行测试,可以确保我们的 ACL 配置在实际运行中能够正确地发挥作用。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注