男人
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} |
限制控制器
要应用对控制器的访问,您可以采取两种方式,其中一种是编写函数 _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