Ver Mensaje Individual
  #2 (permalink)  
Antiguo 17/02/2010, 01:38
Avatar de Nemutagk
Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 1 mes
Puntos: 406
Respuesta: Ejemplo ACL con Clases

Cita:
Pero luego no viene como y desde donde llamar a esta clase, ni como denegar o permitir Action de los diferentes Controller de la aplicacion.
Se me olvido comentar, en la clase que publicaste es donde indicas si deniegas o permites el acceso a los módulos/controladores/acciones dependiendo del rol del usuario que los solicita, hay mismo indicas los roles que tu aplicación soportará

Ahora tienes que crear un Controller_Plugin para verificar estos datos, un ejemplo seria:
Código PHP:
Ver original
  1. class My_Plugins_Acl extends Zend_Controller_Plugin_Abstract
  2. {    
  3.     public function __construct() {
  4.         $this->_auth = Zend_Auth::getInstance();
  5.         $this->_acl = new My_Acl();
  6.     }
  7.    
  8.     public function preDispatch(Zend_Controller_Request_Abstract $request) {
  9.         //Obtengo las credenciales del usuario
  10.         $role = $this->_auth->hasIdentity() ? $this->_auth->getInstance()->getIdentity()->role : 'guest';
  11.        
  12.         //Tomamos el nombre del recurso actual (action,controller,module)
  13.         if ($this->_acl->has($this->getRequest()->getActionName())) {
  14.             $resource = $this->getRequest()->getActionName();
  15.         }else if ($this->_acl->has($this->getRequest()->getControllerName())) {
  16.             $resource = $this->getRequest()->getControllerName();
  17.         }else if ($this->_acl->has($this->getRequest()->getModuleName())) {
  18.             $resource = $this->getRequest()->getModuleName();
  19.         }
  20.        
  21.         //Ahora verificaremos los permisos
  22.         //Si no pasa la prueba (!$this->_acl_isAllowed), entonses el usuario no a iniciado sesion y si
  23.         //el rol es guest mando al modulo auth a iniciar session
  24.         if (!$this->_acl->isAllowed($role,$resource) && $role == 'guest') {
  25.             $request->setModuleName('default');
  26.             $request->setControllerName('authentication');
  27.             $request->setActionName('sigin');
  28.         }
  29.        
  30.         //Ahora si no ah pasado la prueba y NO ES guest, entonses muestro un mensaje de error
  31.         if (!$this->_acl->isAllowed($role, $resource)) {
  32.             $request->setModuleName('default');
  33.             $request->setControllerName('authentication');
  34.             $request->setActionName('error');
  35.         }
  36.     }
  37. }
  38. ?>

y por ultimo registramos el plugin en el Bootstrap.php

Código PHP:
Ver original
  1. public function _initPlugins() {
  2.         $this->bootstrap('frontController');
  3.        
  4.         //Registro los plugins
  5.         $this->frontController->registerPlugin(new My_Plugins_Acl());
  6.     }

Pero para esto, tienes que combinar Zend_Acl con Zend_Auth para que funcione!!!
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)

Última edición por Nemutagk; 17/02/2010 a las 01:43