Implementé algo similar no hace tanto tiempo. El concepto básico sigue en un código de ejemplo.
Creé mi propio archivo configAcl.php que se carga en el archivo bootstrap, en mi caso es index.php. Así es cómo estaría de acuerdo con su caso:
$acl = new Zend_Acl();
$roles = array('admin', 'normal');
// Controller script names. You have to add all of them if credential check
// is global to your application.
$controllers = array('auth', 'index', 'news', 'admin');
foreach ($roles as $role) {
$acl->addRole(new Zend_Acl_Role($role));
}
foreach ($controllers as $controller) {
$acl->add(new Zend_Acl_Resource($controller));
}
// Here comes credential definiton for admin user.
$acl->allow('admin'); // Has access to everything.
// Here comes credential definition for normal user.
$acl->allow('normal'); // Has access to everything...
$acl->deny('normal', 'admin'); // ... except the admin controller.
// Finally I store whole ACL definition to registry for use
// in AuthPlugin plugin.
$registry = Zend_Registry::getInstance();
$registry->set('acl', $acl);
Otro caso es si desea permitir que el usuario normal sólo "lista" acción en todos los controladores. Es bastante simple, deberá añadir línea como la siguiente:
$acl->allow('normal', null, 'list'); // Has access to all controller list actions.
A continuación, debe crear un nuevo plugin que se encarga de la comprobación de credenciales automáticamente cuando hay una solicitud por alguna acción del controlador. Esta comprobación tiene lugar en el método preDispatch() que se llama antes de cada llamada a la acción del controlador.
Aquí es AuthPlugin.php:
class AuthPlugin extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$loginController = 'auth';
$loginAction = 'login';
$auth = Zend_Auth::getInstance();
// If user is not logged in and is not requesting login page
// - redirect to login page.
if (!$auth->hasIdentity()
&& $request->getControllerName() != $loginController
&& $request->getActionName() != $loginAction) {
$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector');
$redirector->gotoSimpleAndExit($loginAction, $loginController);
}
// User is logged in or on login page.
if ($auth->hasIdentity()) {
// Is logged in
// Let's check the credential
$registry = Zend_Registry::getInstance();
$acl = $registry->get('acl');
$identity = $auth->getIdentity();
// role is a column in the user table (database)
$isAllowed = $acl->isAllowed($identity->role,
$request->getControllerName(),
$request->getActionName());
if (!$isAllowed) {
$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector');
$redirector->gotoUrlAndExit('/');
}
}
}
}
Pasos finales están cargando su configAcl.php y registrar el AuthPlugin de archivo de arranque (probablemente index.php).
require_once '../application/configAcl.php';
$frontController = Zend_Controller_Front::getInstance();
$frontController->registerPlugin(new AuthPlugin());
Así que este es el concepto básico. No probé el código anterior (copie y pegue y vuelva a escribir solo para el propósito del escaparate), por lo que no es a prueba de balas. Solo para dar una idea.
EDITAR
Para la claridad. El código anterior en AuthPlugin supone que el objeto $ identity está lleno de datos de usuario (columna "rol" en la base de datos). Esto podría hacerse dentro del proceso de inicio de sesión como este:
[...]
$authAdapter = new Zend_Auth_Adapter_DbTable($db);
$authAdapter->setTableName('Users');
$authAdapter->setIdentityColumn('username');
$authAdapter->setCredentialColumn('password');
$authAdapter->setIdentity($username);
$authAdapter->setCredential(sha1($password));
$authAdapter->setCredentialTreatment('? AND active = 1');
$auth = Zend_Auth::getInstance();
$result = $auth->authenticate($authAdapter);
if ($result->isValid()) {
$data = $authAdapter->getResultRowObject(null, 'password'); // without password
$auth->getStorage()->write($data);
[...]
¿A dónde va esto en la estructura de mi sitio? APLICACIÓN controlador modelos vistas PÚBLICO css imágenes js de flash BIBLIOTECA Zend algún consejo? – Udders
configAcl.php puede estar en cualquier lugar de su directorio de aplicaciones, solo para su inclusión en index.php. AuthPlugin debe estar en su biblioteca, por lo tanto, Zend puede cargarlo automáticamente y no tiene que usar require_once. Las últimas declaraciones entre [...] dependen de su proceso de inicio de sesión ... –