A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

17.14. Agregar el complemento de controlador y un ayudante de vista Access

Para consultar el RbacManager dentro de los controladores y las plantillas de vista necesitamos crear un complemento de controlador especial (que llamaremos Access) y un ayudante de vista especial (que también llamaremos Access).

17.14.1. Complemento de controlador Access

A veces se necesita revisar algunos permisos dentro del controlador. Por ejemplo, esto es necesario para el permiso profile.own.view que usa una aserción dinámica. Con este propósito crearemos el complemento para controladores Access.

El código del complemento se guardará dentro del archivo AccessPlugin.php dentro de la carpeta Controller/Plugin que está dentro de la carpeta fuente del módulo User:

<?php
namespace User\Controller\Plugin;

use Zend\Mvc\Controller\Plugin\AbstractPlugin;

/**
 * This controller plugin is used for role-based access control (RBAC).
 */
class AccessPlugin extends AbstractPlugin
{
    private $rbacManager;

    public function __construct($rbacManager)
    {
        $this->rbacManager = $rbacManager;
    }

    /**
     * Checks whether the currently logged in user has the given permission.
     * @param string $permission Permission name.
     * @param array $params Optional params (used only if an assertion is associated with permission).
     */
    public function __invoke($permission, $params = [])
    {
        return $this->rbacManager->isGranted(null, $permission, $params);
    }
}

La fábrica del complemento Access tiene el contenido siguiente:

<?php
namespace User\Controller\Plugin\Factory;

use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
use User\Service\RbacManager;
use User\Controller\Plugin\AccessPlugin;

/**
 * This is the factory for AccessPlugin. Its purpose is to instantiate the plugin
 * and inject dependencies into its constructor.
 */
class AccessPluginFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        $rbacManager = $container->get(RbacManager::class);

        return new AccessPlugin($rbacManager);
    }
}

El complemento se registra dentro del archivo module.config.php de la siguiente manera:

// We register module-provided controller plugins under this key.
'controller_plugins' => [
    'factories' => [
        Controller\Plugin\AccessPlugin::class => Controller\Plugin\Factory\AccessPluginFactory::class,
    ],
    'aliases' => [
        'access' => Controller\Plugin\AccessPlugin::class,
    ],
],

Así, en nuestra acción de controlador podemos con facilidad llamar al complemento de la siguiente manera:

if (!$this->access('profile.own.view', ['user'=>$user])) {
    return $this->redirect()->toRoute('not-authorized');
}

17.14.2. Ayudante de vista Access

A veces necesitamos consultar el RbacManager dentro de la plantilla de vista. Por ejemplo, podríamos necesitar ocultar o mostrar un bloque de código HTML basado en los actuales permisos del usuario. Para hacer esto, implementaremos el ayudante de vista Access.

El código del ayudante de vista se colocará dentro del archivo Access.php que guardaremos dentro de la carpeta View/Helper que está dentro de la carpeta fuente del módulo User:

<?php
namespace User\View\Helper;

use Zend\View\Helper\AbstractHelper;

/**
 * This view helper is used to check user permissions.
 */
class Access extends AbstractHelper
{
    private $rbacManager = null;

    public function __construct($rbacManager)
    {
        $this->rbacManager = $rbacManager;
    }

    public function __invoke($permission, $params = [])
    {
        return $this->rbacManager->isGranted(null, $permission, $params);
    }
}

La fábrica para el ayudante de vista Access tiene el siguiente código:

<?php
namespace User\View\Helper\Factory;

use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
use User\Service\RbacManager;
use User\View\Helper\Access;

/**
 * This is the factory for Access view helper. Its purpose is to instantiate the helper
 * and inject dependencies into its constructor.
 */
class AccessFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        $rbacManager = $container->get(RbacManager::class);

        return new Access($rbacManager);
    }
}

El ayudante de vista se registra dentro del archivo de configuración module.config.php de la siguiente manera:

// We register module-provided view helpers under this key.
'view_helpers' => [
    'factories' => [
        View\Helper\Access::class => View\Helper\Factory\AccessFactory::class,
    ],
    'aliases' => [
        'access' => View\Helper\Access::class,
    ],
],

Así, podemos fácilmente llamar al ayudante de vista desde cualquier plantilla de vista de la siguiente manera:

if ($this->access('profile.own.view, ['user'=>$user]))) {
   // do something...
}

Top