Magento 2 模塊開發(fā)基礎(chǔ)部分 - 目錄
Magneto 2的ACL面板使用授權(quán)系統(tǒng)來創(chuàng)建權(quán)控制規(guī)則,權(quán)限控制規(guī)則可以讓店鋪所有者為每個(gè)用戶創(chuàng)建非常細(xì)粒度的角色。本文我們來研究它的工作機(jī)制并為我們的自定義模塊添加權(quán)限控制。
Magento 2 權(quán)限控制列表規(guī)則
后臺(tái) ACL資源 可以在 System > Permissions > User Roles 菜單下看到。當(dāng)我們點(diǎn)擊 Add new Role 按鈕會(huì)看到如下圖頁面:

在這個(gè)權(quán)限資源面板你可看到一個(gè)樹狀列表顯示的系統(tǒng)中定義的所有權(quán)限資源。你可以選擇所有權(quán)限資源,也可以給角色或用戶選擇某幾個(gè)權(quán)限資源。所有屬于當(dāng)前角色的用戶都限定只能訪問你選擇的權(quán)限資源,他們不能看到或訪問其它權(quán)限資源。
要添加后臺(tái)管理員ACL有如下幾步:
- 1 添加 ACL 規(guī)則
- 2 清空緩存
- 3 檢測ACL規(guī)則
第一步 創(chuàng)建ACL規(guī)則
還是使用HelloWorld模塊演示如何添加權(quán)限控制。在上兩章節(jié)我們經(jīng)常會(huì)看到 resource 這個(gè)屬性。現(xiàn)在讓我們把那些權(quán)限資源注冊到系統(tǒng)里,以便系統(tǒng)識(shí)別并讓我們可以把這些權(quán)限資源指派到某個(gè)角色。要注冊權(quán)限資源我們使用位于 app/code/{namespace}/{modeule}/etc/acl.xml 的這個(gè) acl.xml 文件。下面開始創(chuàng)建:
文件 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="參數(shù)設(shè)置" 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="你好世界設(shè)置" sortOrder="100"/>
</resource>
</resource>
</resource>
</resource>
</resources>
</acl>
</config>
我們的權(quán)限資源做為子節(jié)點(diǎn)放在 Magneto_Backend::admin 節(jié)點(diǎn)下面,每個(gè)權(quán)限資源都會(huì)有 id, title, sortOrder 屬性:
- id 是資源的唯一標(biāo)識(shí)。你可以在定義后臺(tái)菜單、參數(shù)配置時(shí)把這個(gè)標(biāo)識(shí)作為值賦給
resource屬性。標(biāo)識(shí)是唯一的并且格式是: Vendor_ModuleName::resource_name。 - title 屬性是在權(quán)限資源樹列表顯示的名稱
- sortOrder 控制權(quán)限資源在樹中顯示的順序
接下來清空緩存并查看權(quán)限資源樹:

第二步 清緩存
第三步 測試 ACL 規(guī)則
有很多地方我們可以使用ACL權(quán)限資源控制用戶的訪問:
后臺(tái)菜單: 使用 ACL 權(quán)限資源可以對(duì)未授權(quán)用戶隱藏菜單項(xiàng)
文件: 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" />
系統(tǒng)參數(shù)設(shè)置: 使用ACL權(quán)限資源限制 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>
權(quán)限資源也可以用于控制器
后臺(tái)控制器
系統(tǒng)提供接口 Magento\Framework\AuthorizationInterface,使用這個(gè)接口可以判斷當(dāng)前登陸用戶是否有特定權(quán)限??梢酝ㄟ^變量: $this->_authorization 獲取它的實(shí)例對(duì)象。在控制器中需要定義一個(gè)保護(hù)方法來檢測權(quán)限資源:
如文件: vendor/magento/module-customer/Controler/Adminhtml/Index.php
protected function _isAlloed()
{
return $this->_authorization->isAllowed('Magento_Customer::manage');
}