Magento 2 开发内容目录

Magneto 2的ACL面板使用授权系统来创建权控制规则,权限控制规则可以让店铺所有者为每个用户创建非常细粒度的角色。本文我们来研究它的工作机制并为我们的自定义模块添加权限控制。

Magento 2 权限控制列表规则

后台 ACL资源 可以在 System > Permissions > User Roles 菜单下看到。当我们点击 Add new Role 按钮会看到如下图页面:

role resources

在这个权限资源面板你可看到一个树状列表显示的系统中定义的所有权限资源。你可以选择所有权限资源,也可以给角色或用户选择某几个权限资源。所有属于当前角色的用户都限定只能访问你选择的权限资源,他们不能看到或访问其它权限资源。

要添加后台管理员ACL有如下几步:

第一步 创建ACL规则

还是使用HelloWorld模块演示如何添加权限控制。在上两章节我们经常会看到 resource 这个属性。现在让我们把那些权限资源注册到系统里,以便系统识别并让我们可以把这些权限资源指派到某个角色。要注册权限资源我们使用位于 app/code/{namespace}/{modeule}/etc/acl.xml 的这个 acl.xml 文件。下面开始创建:

文件 app/code/Aqrun/HelloWorld/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="Aqrun_HelloWorld::helloworld" title="你好世界" 
                    translate="title" sortOrder="51">
                    <resource id="Aqrun_HelloWorld::post" title="文章管理" 
                        translate="title" sortOrder="51" />
                    <resource id="Aqrun_HelloWorld::helloworld_configuration" 
                        translate="title" title="参数设置" sortOrder="99" />
                </resource>
                <resource id="Magento_Backend::stores">
                    <resource id="Magento_Backend::stores_settings">
                        <resource id="Magento_Config::config">
                            <resource id="Aqrun_HelloWorld::helloworld_config"
                                translate="title" title="你好世界设置" sortOrder="100"/>
                        </resource>
                    </resource>
                </resource>
            </resource>
        </resources>
    </acl>
</config>

我们的权限资源做为子节点放在 Magneto_Backend::admin 节点下面,每个权限资源都会有 id, title, sortOrder 属性:

接下来清空缓存并查看权限资源树:

role resources added

第二步 清缓存

第三步 测试 ACL 规则

有很多地方我们可以使用ACL权限资源控制用户的访问:

后台菜单: 使用 ACL 权限资源可以对未授权用户隐藏菜单项

文件: app/code/Aqrun/HelloWorld/etc/adminhtml/menu.xml

<add id="Aqrun_HelloWorld::helloworld" title="Hello World" module="Aqrun_HelloWorld" sortOrder="51"
    resource="Aqrun_HelloWorld::helloworld" />

系统参数设置: 使用ACL权限资源限制 section 的访问

文件: app/code/Aqrun/HelloWorld/etc/adminhtml/system.xml

<section id="helloworld" translate="label" sortOrder="130" showInDefault="1" showInWebsite="1" showInStore="1">
        ….
            <resource>Mageplaza_HelloWorld::helloworld_configuration</resource>
        ….
</section>

权限资源也可以用于控制器

后台控制器

系统提供接口 Magento\Framework\AuthorizationInterface,使用这个接口可以判断当前登陆用户是否有特定权限。可以通过变量: $this->_authorization 获取它的实例对象。在控制器中需要定义一个保护方法来检测权限资源:

如文件: vendor/magento/module-customer/Controler/Adminhtml/Index.php

protected function _isAlloed()
{
    return $this->_authorization->isAllowed('Magento_Customer::manage');
}