Foros del Web » Programando para Internet » PHP » Zend »

ACL y menú de navegación

Estas en el tema de ACL y menú de navegación en el foro de Zend en Foros del Web. En mi módulo.php llamo a mi plugin para que verifique los permisos de los usuarios según el rol, y si no tiene permiso lo reenvió ...
  #1 (permalink)  
Antiguo 04/12/2014, 15:40
 
Fecha de Ingreso: diciembre-2007
Mensajes: 169
Antigüedad: 16 años, 10 meses
Puntos: 6
Pregunta ACL y menú de navegación

En mi módulo.php llamo a mi plugin para que verifique los permisos de los usuarios según el rol, y si no tiene permiso lo reenvió a una página.

El asunto es que en mi layout.phtml tengo un menú, pero para el rol "editor" debo elimnar unas opciones del menú, he estado leyendo que al parecer se pude pasar el acl al layout e imprimr un menú con de acuerdo al rol actual, pero por más que intento no me funciona.

Alguien sabe como hacerlo así como para dummies, please.

O sea lo que quiero hacer, es que si es "admin" aparezcan todas las opciones del menú, si es "editor" que aparezcan algunas menos, por ejemplo.

¿Pero como verifico en el layout que permiso tiene? :( ayudaa !!!!! He buscado lo de view->navigator pero desde el plugin no tengo la variable $view

Aquí estan mis códigos como valido el rol y el usuario, dentro de mi archivo Module.php tengo esta función que llamo desde la función onBootstrap

Código PHP:
public function loadConfiguration(MvcEvent $e)
    {
        
$application   $e->getApplication();
        
$sm            $application->getServiceManager();
        
$sharedManager $application->getEventManager()->getSharedManager();
         
        
$router  $sm->get('router');
        
$request $sm->get('request');

        
$matchedRoute $router->match($request);

        if (
null !== $matchedRoute) { 

            
$params $matchedRoute->getParams();
            
$controller $params['controller'];
            
$action $params['action'];

            
$sharedManager->attach(
                
'Zend\Mvc\Controller\AbstractActionController','dispatch'
                function(
$e) use ($sm,$controller,$action) {
                    
$sm->get('ControllerPluginManager')->get('Myplugin')
                       ->
doAuthorization($e,$controller,$action); 
                },
2
            
);
        }
    } 
Esta función ejecuta mi plugin

Código PHP:
class Myplugin extends AbstractPlugin
{
    private 
$auth;
    protected 
$sesscontainer ;
 
    public function 
__construct() {
        
$this->auth = new AuthenticationService();
    }
     
    public function 
doAuthorization($e,$controller_name,$action_name)
    {
        
$identi $this->auth->getStorage()->read();
        
$namespace substr($controller_name0strpos($controller_name'\\'));
        
//No ha iniciado sesión
        
if( $identi==false || $identi==null ){

            if( !(
$namespace =='Usuarios' && $action "login") )
                
$this->sinPermiso($e);
            return;

        } 

        
$acl = new Acl();
        
//add role ..
        
$acl->addRole(new Role('Anonimo'));
        
$acl->addRole(new Role('Editor'),  'Anonimo');
        
$acl->addRole(new Role('Admin'), 'Editor');
         
        
$acl->addResource(new Resource('Actas'));
        
$acl->addResource(new Resource('Usuarios'));
        
$acl->addResource(new Resource('Carreras'));
        
$acl->addResource(new Resource('IC'));
         
        
$acl->allow('Anonimo''Usuarios', array('login','autenticado','cerrar'));
        
$acl->allow('Editor''Usuarios''index');
            
$acl->allow('Editor''Actas'
                array(
                    
'index',
                    
'editando',
                    
'completadas',
                    
'ver',
                    
'nuevo',
                    
'editar',
                    
'eliminar',
                    
'pdf',
                    
'buscarCarreras',
                    
'buscarUsuarios'
                
)
            );
        
        
         
       
        
//admin is child of user, can publish, edit, and view too !
        
$acl->allow('Admin',
            array(
'Actas'),
            array(
'publish''edit')
        );
        
        
$role = (! $identi->permisos ) ? 'Anonimo' $identi->permisos;

        
$controller $e->getTarget();
        
$controller->layout()->nombres $identi->nombres;
        
$controller->layout()->sexo $identi->sexo;
        
$controller->layout()->id_usuario $identi->id_usuario;


        
$pages = array(array(
                 
'label' => 'Actas',
                 
'uri'           => 'javascript:;'
                 
'pages' => array(
                    array(
                        
'label'      => 'Listar Actas',
                        
'route'      => 'actas',
                        
'controller' => 'actas',
                        
'action'     => 'index',
                    ),
                    array(
                        
'label'      => 'Nueva Actaa',
                        
'route'      => 'actas',
                        
'controller' => 'actas',
                        
'action'     => 'nuevo',
                    )
                 )
             ));

        
//no tiene permisos para ingresar a esa vista
        
if ( ! $acl->isAllowed($role$namespace$action_name)){
            
$this->sinPermiso($e);
        } 

    }
    public function 
sinPermiso($e){

            
$router $e->getRouter();            
            
$url    $router->assemble(array(), array('name' => 'usuarios'));
         
            
$response $e->getResponse();
            
$response->setStatusCode(302);
            
$response->getHeaders()->addHeaderLine('Location'$url);
            
$e->stopPropagation(); 

    }

__________________
Inspiracion
  #2 (permalink)  
Antiguo 14/10/2015, 10:22
Avatar de zerokull  
Fecha de Ingreso: noviembre-2009
Mensajes: 153
Antigüedad: 14 años, 11 meses
Puntos: 1
Respuesta: ACL y menú de navegación

Hola yo ya tengo echa esa funcionalidad.
Si quieres te paso todo el código y base, ya después lo adaptas. saludos

Etiquetas: nav, zf2
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:06.