Magento ACL
#php #magento #acl #adobecommerce

男人

Crea una regla de lista de control de acceso (ACL)
Crear archivo acl
Crear un rol por código
Restringir el acceso a usuarios
Restringir Controladores
Restringiendo contenido
Zend Acl

创建访问控制列表规则

Magento 2中的访问控制列表用于为Magento管理区域的特定用户定义权限。
可以使用ACL,以控制您可以执行用户的共享,例如查看MenãºS,访问控制器,端台(API)和布局条件块。

创建ACL文件

资源必须通过模块的etc/acl.xml文件来定义。如果其模块的ETC文件夹中没有文件,则应创建它。

Resorce标签必须包含以下属性

中显示 的位置
Atributo 描述
id 必须具有以下格式的唯一字符串: {vendor} _ {module} :: {resource_id}
标题 tyulus在MenãºBar
sortorder 显示了Menãº
<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}::{resource_id}" title="{Resource Title}" sortOrder="100">
          <resource id="{Vendor}_{Module}::{sub_resource_id}" title="{Sub Resource Title}" sortOrder="10"/>
        </resource>
      </resource>
    </resources>
  </acl>
</config>

请记住,此后,必须清洁bin/magento cache:clear缓存或单击Sistema > Administración de caché > Vaciar caché de Magento

创建角色

此步骤被说明是通过升级通过代码来创建角色。回想一下这一步是应付的
向上

<?php

namespace {Vendor}\{Module}\Setup;

use Magento\Authorization\Model\Acl\Role\Group
use Magento\Authorization\Model\RoleFactory;
use Magento\Authorization\Model\RulesFactory;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\UpgradeDataInterface;
use Magento\Authorization\Model\UserContextInterface;

class UpgradeData implements UpgradeDataInterface
{
    /**
     * @var RoleFactory
     */
    private RoleFactory $roleFactory;
    private RuleFactory $ruleFactory;

    /**
     * @param RoleFactory $roleFactory
     */
    public function __construct(
        RoleFactory $roleFactory,
        RuleFactory $ruleFactory
    ) {
        $this->roleFactory = $roleFactory;
    }

    /**
     * En este ejemplo, usamos la instancia de Role en el cual se usan los siguientes metodos para crear el rol
     * setName: Es el nombre del rol que se va a crear.
     * setRoleType: Aquí se define el grupo al que va a pertenecer el rol
     * setUserType: Aquí se define el tipo de usuario al que va a pertenecer el rol
     *
     * El array de resouces son los modulos o recursos a los que el rol podra tener acceso.
     */
    public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();

        /** @var Magento\Authorization\Model\Role $role */
        $role = $this->roleFactory->create();
        $role->setName('{Role Name}')
            ->setRoleType(Group::ROLE_TYPE)
            ->setUserType(UserContextInterface::USER_TYPE_ADMIN)
            ->setPid(0);

        $resources = [
            '{Vendor}_{Module}::{resource_id}',
            '{Vendor}_{Module}::{sub_resource_id}',
        ];

        $role->save();
        $rule = $this->ruleFactory->create();
    $rule->setRoleId(
        $role->getId()
    )->setResources($resources)->saveRel();

        $setup->endSetup();
    }
}

以下代码举例说明了我们如何将更多资源添加到以前已经分配资源的现有角色中。

<?php

namespace {Vendor}\{Module}\Setup;

use Magento\Authorization\Model\RoleFactory;
use Magento\Authorization\Model\RulesFactory;
use Magento\Authorization\Model\Acl\AclRetriever;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\UpgradeDataInterface;

class UpgradeData implements UpgradeDataInterface
{
    /**
     * @var RoleFactory
     */
    private RoleFactory $roleFactory;
    private RulesFactory $ruleFactory;
    private AclRetriever $aclRetriever;

    /**
     * @param RoleFactory $roleFactory
     */
    public function __construct(
        RoleFactory $roleFactory,
        RulesFactory $ruleFactory,
        AclRetriever $aclRetriever
    ) {
        $this->roleFactory = $roleFactory;
        $this->ruleFactory = $ruleFactory;
        $this->aclRetriever = $aclRetriever;
    }

    /**
     * En este ejemplo, se le agregan los recursos al rol "Desarrollador" para que pueda acceder a los modulos
     *
     * El array de resouces son los modulos o recursos a los que el rol podra tener acceso.
     */
    public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        if (version_compare($context->getVersion(), '1.0.1', '<')) {
            /** @var Magento\Authorization\Model\Role $role */
            $role = $this->roleFactory->create()->load('Desarrollador', 'role_name');
            $resources = $this->aclRetriever->getAllowedResourcesByRole(
                $role->getId()
            );
            $resources = array_merge($resources, [
                'Movil_Regulatorio::regulatorio',
                'Movil_Regulatorio::report',
                'Movil_Regulatorio::clientes'
            ]);
            $this->ruleFactory->create()->setRoleId(
                $role->getId()
            )->setResources($resources)->saveRel();
        }

        $setup->endSetup();
    }
}

限制对用户的访问

在模块中,创建以下etc/adminhtml/menu.xml文件,此文件将为未经授权的用户创建男性男士。节点中的属性确定哪些资源可以访问

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd">
    <menu>
     <add id="{Vendor}_{Module}::menu" title="Custom Menu" module="{Vendor}_{Module}" sortOrder="10" resource="{Vendor}_{Module}::menu"/>
     <add id="{Vendor}_{Module}::create" title="Create" module="{Vendor}_{Module}" sortOrder="10" parent="{Vendor}_{Module}::menu" action="custommenu/create/index" resource="{Vendor}_{Module}::create"/>
     <add id="{Vendor}_{Module}::delete" title="Delete" module="{Vendor}_{Module}" sortOrder="20" parent="{Vendor}_{Module}::menu" action="custommenu/delete/index" resource="{Vendor}_{Module}::delete"/>
     <add id="{Vendor}_{Module}::view" title="View" module="{Vendor}_{Module}" sortOrder="30" parent="{Vendor}_{Module}::menu" action="custommenu/view/index" resource="{Vendor}_{Module}::view"/>
    </menu>
</config>
中显示 的位置 的男人
Atributo 描述
id 必须具有以下格式的唯一字符串: {vendor} _ {module} :: {resource_id}
标题 tyulus在MenãºBar
模块 Módulo包含当前男人
sortorder 显示了Menãº
父母 当前的父亲
动作 单击男人后必须显示的页面的URL。您必须具有以下格式: {front_name}/{controler_path}/{action}
资源 ACL规则限制访问 {vendor} _ {module} :: {subresource_id}

menu

限制控制器

要应用对控制器的访问,您可以采取两种方式,其中一种是编写函数 _isalowed ,另一个是关于编写常数 admin_Resource 。第二个选项可行,该函数_isalow的编写如下:

    /**
     * Determines whether current user is allowed to access Action
     *
     * @return bool
     */
    protected function _isAllowed()
    {
        return $this->_authorization->isAllowed(static::ADMIN_RESOURCE);
    }
<?php

namespace {Vendor}\{Module}\Controller\Adminhtml;

use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Framework\App\ResponseInterface;
use Magento\Framework\View\Result\PageFactory;

class Crud extends Action
{
    /** Por medio de sobre escribir la constante */
    const ADMIN_RESORUCE = '{Vendor}_{Module}::{subresource_id}';
}

编写功能时,如下:

<?php

namespace {Vendor}\{Module}\Controller\Adminhtml;

use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Framework\App\ResponseInterface;
use Magento\Framework\View\Result\PageFactory;

class Crud extends Action
{
    /**
     * @override to allow access to this controller
     * @return bool
    */
    protected function _isAllowed()
   {
        return $this->_authorization->isAllowed('{Vendor}_{Module}::{subresource_id}');
   }
}

限制内容

使用ACL也可能

<block class="{Vendor}\{Module}\Block\Adminhtml\Type" name="block.example" aclResource="{Vendor}_{Module}::{subresource_id}">
    <!-- ... -->
</block>

Zend ACL

虽然要知道如何在Magento中实施ACL,但对于特权管理,它也很有趣。通常,应用程序可以使用此类ACL来控制其他请求对象对某些受保护对象的访问。

要提出一点上下文,让我们定义以下内容:

  • a 角色是一个可以要求访问资源的对象。
  • a 资源是控制访问的对象。

在这种情况下,角色请求访问资源,

代码1

<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Framework;

/**
 * ACL. Can be queried for relations between roles and resources.
 *
 * @api
 * @since 100.0.2
 */
class Acl extends \Zend_Acl
{

举一个例子,我们可以假设对于FOO文件,在这种情况下,这将是资源,用户具有所有特权。用户B仅读取 - 仅访问,而用户C无法访问该文件。

在此示例中,ACL为文件定义了访问控制的多元素,并确定授予或拒绝对文件的访问以及可以执行哪些操作的用户(例如读取,编写或执行文件)。

在Zend中,我们可以用如下来举例说明此示例:

$acl = new Zend_Acl();
$acl->addRole(new Zend_Acl_Role('A'));
$acl->addRole(new Zend_Acl_Role('B'));
$acl->addRole(new Zend_Acl_Role('C'));

$acl->addResource(new Zend_Acl_Resource('Foo'));
$acl->allow('A', 'Foo', ['read', 'write', 'delete']);
$acl->allow('B', 'Foo', ['read']);
$acl->deny('C', 'Foo');

$acl->isAllowed('A', 'Foo', 'read'); // true
$acl->isAllowed('A', 'Foo', 'write'); // true
$acl->isAllowed('A', 'Foo', 'delete'); // true
$acl->isAllowed('B', 'Foo', 'read'); // true
$acl->isAllowed('B', 'Foo', 'write'); // false
$acl->isAllowed('B', 'Foo', 'delete'); // false
$acl->isAllowed('C', 'Foo', 'read'); // false
$acl->isAllowed('C', 'Foo', 'write'); // false
$acl->isAllowed('C', 'Foo', 'delete'); // false