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
).
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');
}
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...
}