php - ZF2 Genera navegación usando zfcrbac zfcUser y estrategia de roles jerárquica
zend-framework zend-framework2 (1)
Te mostraré cómo ZfcRbac puede trabajar con Zend / Navegación (ZF2). Tiene una definición de permisos en la base de datos, por eso voy a omitir esta sección.
Defina su navegación agregando páginas y permisos:
config / global.phpPHP:
return array(
''navigation'' => array(
''default'' => array(
array(
''label'' => ''Contracts'',
''route'' => ''contract'',
''action'' => ''list'',
''permission'' => ''contract.list'',
''pages'' => array(
array(
''label'' => ''New contract'',
''route'' => ''contract'',
''action'' => ''add'',
''permission'' => ''contract.add'',
)
)
)
)
),
''service_manager'' => array(
''factories'' => array(
''navigation'' => ''Zend/Navigation/Service/DefaultNavigationFactory'',
)
)
);
Crear un oyente (/module/Application/src/Application/Authorization/RbacListener.php):
<?php
namespace Application/Authorization;
use Zend/EventManager/EventInterface;
use Zend/Navigation/Page/AbstractPage;
use ZfcRbac/Service/AuthorizationServiceInterface;
class RbacListener
{
/**
* @var AuthorizationServiceInterface
*/
protected $authorizationService;
/**
* @param AuthorizationServiceInterface $authorizationService
*/
public function __construct(AuthorizationServiceInterface $authorizationService)
{
$this->authorizationService = $authorizationService;
}
/**
* @param EventInterface $event
* @return bool|void
*/
public function accept(EventInterface $event)
{
$page = $event->getParam(''page'');
if (!$page instanceof AbstractPage) {
return;
}
$permission = $page->getPermission();
if (is_null($permission)) {
$event->stopPropagation();
return false;
}
$event->stopPropagation();
return $this->authorizationService->isGranted($permission);
}
}
Cree una fábrica para el RbacListener (/module/Application/src/Application/Factory/RbacListenerFactory.php):
<?php
namespace Application/Factory;
use Application/Authorization/RbacListener;
use Zend/ServiceManager/FactoryInterface;
use Zend/ServiceManager/ServiceLocatorInterface;
class RbacListenerFactory implements FactoryInterface
{
/**
* {@inheritDoc}
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
$authorizationService = $serviceLocator->get(''ZfcRbac/Service/AuthorizationService'');
return new RbacListener($authorizationService);
}
}
Agregue su RbacListenerFactory a su ServiceManager (/module/Application/config/module.config.php):
<?php
return array(
''service_manager'' => array(
''factories'' => array(
''Application/Authorization/RbacListener'' => ''Application/Factory/RbacListenerFactory'',
),
),
);
Adjunte un evento al método isAllowed de Zend Navigation View Helper (y finalmente adjunte un evento al método isAllowed de Zend Navigation View Helper):
<?php
public function onBootstrap(MvcEvent $event)
{
$application = $event->getApplication();
$eventManager = $application->getEventManager();
$sharedEventManager = $eventManager->getSharedManager;
$serviceManager = $application->getServiceManager();
$rbacListener = $serviceManager->get(''Application/Authorization/RbacListener'');
$sharedEventManager->attach(
''Zend/View/Helper/Navigation/AbstractHelper'',
''isAllowed'',
array($rbacListener, ''accept'')
);
}
Para mostrar el menú a la vista o el diseño:
<?php echo $this->navigation(''navigation'')->menu(); ?>
Estoy usando este código y funciona bastante bien. Está basado en:
Comienzo en zf2 y tengo que manejar muchos a muchos permisos / roles. Usando ZfcRbac .
Así que hago una asignación con el rol de usuario / jerárquico (nombre de la tabla = rol) / permisos
Y hago algunos guardias con política de denegación.
Mi guardia, mapeo, base de datos, están bien.
Mi entidad HierarchicalRole se ve así:
class HierarchicalRole implements HierarchicalRoleInterface
Y es, por ahora, lo mismo que el original dado por Bakura.
Mi entidad de usuario se ve así:
class User extends ZfcUserEntity implements IdentityInterface
con
/**
* @var /Doctrine/Common/Collections/Collection
* @ORM/ManyToMany(targetEntity="HierarchicalRole")
* @ORM/JoinTable(
* name="user_role_linker",
* joinColumns={@ORM/JoinColumn(name="user_id", referencedColumnName="idUser")},
* inverseJoinColumns={@ORM/JoinColumn(name="role_id", referencedColumnName="id")}
* )
*/
protected $roles;
y los roles están construidos en constructor por:
function __construct() {
$this->roles = new ArrayCollection();
}
Con zend developerper tools puedo ver que ZfcRbac/Collector/RbacCollector
muestra todo lo que quiero para el usuario real registrado (permiso, hijos, rol principal, etc ...).
Mi pregunta es: ¿cómo generar una navegación dinámica para un usuario que solo puede ver los enlaces que se le concede para acceder? . Y también verifique la conexión cuando el usuario no haya iniciado sesión y la haya ocultado cuando haya iniciado sesión ...
Aún soy un novato, pero de ser posible sería genial tener un ejemplo bien explicado para hacer una buena navegación dinámica usando este módulo.
EDITAR (28 de mayo) Hasta ahora siempre busco una solución, mis intentos no me han ayudado aún ... Puede encontrar uno aquí: Spiffy navigation Todavía no funciona a la perfección.