por favor ayudenme como dije recien aprendo zend, tengo los siguientes problemas al utilizar zend_Acl y Zend_Auth, mi proyecto esta dividido en los siguientes modulos
1. default
2. almacen
3. administrador
para que un usuario acceda a ciertos niveles restrinjo de la siguiente manera con una libreria Zend_Acl
Código PHP:
class Model_LibreriaAcl extends Zend_Acl {
public function __construct() {
//Roles
$this->addRole(new Zend_Acl_Role('default'));
$this->addRole(new Zend_Acl_Role('almacen'));
$this->addRole( new Zend_Acl_Role('administrador'));
$this->addRole(new Zend_Acl_Role('ventas'));
/*
* Recursos para el module default y sus controladores
*/
$this->add(new Zend_Acl_Resource('DEFAULT'));
$this->add(new Zend_Acl_Resource('DEFAULT:INDEX'));
$this->add(new Zend_Acl_Resource('DEFAULT:ERROR'));
$this->add(new Zend_Acl_Resource('DEFAULT:AUTENTIFICACION'));
/*
* Recursos para el Modulo Administrador y sus controladores
*/
$this->add(new Zend_Acl_Resource('ADMINISTRADOR'));
$this->add(new Zend_Acl_Resource('ADMINISTRADOR:INDEX'));
$this->add(new Zend_Acl_Resource('ADMINISTRADOR:ERROR'));
/*
* Recursos para el Modulo Almacen y sus controladores
*/
$this->add(new Zend_Acl_Resource('ALMACEN'));
$this->add(new Zend_Acl_Resource('ALMACEN:INDEX'));
$this->add(new Zend_Acl_Resource('ALMACEN:ERROR'));
/*
* Recursos para el Modulo Ventas y sus controladores
*/
$this->add(new Zend_Acl_Resource('VENTAS'));
$this->add(new Zend_Acl_Resource('VENTAS:INDEX'));
$this->add(new Zend_Acl_Resource('VENTAS:ERROR'));
/*
* Permisos para el rol default recursos, action
*/
$this->allow('default','DEFAULT:INDEX','INDEX');
$this->allow('default','DEFAULT:AUTENTIFICACION','LOGIN');
$this->allow('default','DEFAULT:ERROR','ERROR');
$this->allow('almacen','ALMACEN:INDEX','INDEX');
$this->allow('almacen','ALMACEN:ERROR','ERROR');
$this->allow('administrador','ADMINISTRADOR:INDEX','INDEX');
$this->allow('administrador','ADMINISTRADOR:ERROR','ERROR');
$this->allow('ventas','VENTAS:INDEX','INDEX');
//$this->allow(null,'ERROR');
}
}
y verifico con un pluguin q lo llamo en el bootstrap
Código PHP:
protected function _initAutoLoad() {
$modelLoader = new Zend_Application_Module_Autoloader(array(
'namespace' => '',
'basePath' => APPLICATION_PATH . ''));
if (Zend_Auth::getInstance()->hasIdentity()){
Zend_Registry::set('role', Zend_Auth::getInstance()->getStorage()->read()->NOM_TIPO_EMP);
}else {
Zend_Registry::set('role', 'default');
}
$this->_acl = new Model_LibreriaAcl();
$this->_auth = Zend_Auth::getInstance();
$fc = Zend_Controller_Front::getInstance();
$fc->registerPlugin(new Plugin_VerificarAcceso($this->_acl, $this->_auth));
return $modelLoader;
}
y el plugin es el siguiente
Código PHP:
class Plugin_VerificarAcceso extends Zend_Controller_Plugin_Abstract {
private $_acl = null;
private $_auth=null;
public function __construct(Zend_Acl $acl, Zend_Auth $auth) {
$this->_acl = $acl;
$this->_auth = $auth;
}
public function preDispatch(Zend_Controller_Request_Abstract $request) {
$module = strtoupper($request->getModuleName());
$controller = strtoupper($request->getControllerName());
$action = strtoupper($request->getActionName());
if (Zend_Auth::getInstance()->hasIdentity()){
$rol=Zend_Auth::getInstance()->getStorage()->read()->NOM_TIPO_EMP;
}else {
$rol='default';
}
$resource=$module.':'.$controller;
if(!$this->_acl->isAllowed($rol,$resource, $action)){
$request->setModuleName('default');
$request->setControllerName('Autentificacion');
$request->setActionName('login');
}
}
}
y la forma de autenticar es la siguiente
Código PHP:
public function loginAction() {
$this->view->title = 'Login';
if (Zend_Auth::getInstance()->hasIdentity()) {
$this->_redirect('Autentificacion/login');
}
$request = $this->getRequest();
$form = new Form_Login();
if ($request->isPost()) {
if ($form->isValid($this->_request->getPost())) {
$authAdapter = $this->getAuthAdapter();
$login_usr = $form->getValue('login_usr');
$password_usr = $form->getValue('password_usr');
$authAdapter->setIdentity($login_usr)
->setCredential($password_usr);
$auth = Zend_Auth::getInstance();
$result = $auth->authenticate($authAdapter);
if ($result->isValid()) {
$datos_empleado = $authAdapter->getResultRowObject(null,'PASSWORD_EMPLEADO');
$authStorage = $auth->getStorage();
$rol=$authStorage->read()->NOM_TIPO_EMP;
$authStorage->write($datos_empleado);
$this->_redirect('almacen/index/index');
//$this->_helper->Redirector->gotoSimple('index', 'index', 'almacen');
} else {
$this->view->errorMessage = "Login o Password no son Validos !!!!!!";
}
}
}
$this->view->form = $form;
}
mi pregunta es la siguiente: como redirecciono una vez autenticado por el usuario, por ejemplo el usuario tiene acceso al modulo almacen a totos sus controladores, yo lo redireccionaba un ves autenticado con.
$this->_redirect('almacen/index/index');
pero cuando verifica si tiene permiso o no ese usuario con su rol, es como si no redireccionara, no se como hacer ayudenme por favor, o donde se redirecciona al modulo/controller/acction.