Contexto:práctica aplicación Zend_Acl + Zend_Auth y las mejores prácticas
Mis preguntas se refieren a un foro que estoy desarrollando casi exactamente como tal, donde hay:
- los clientes que tienen acceso a ver hilos pero no puede responder ni votar
- miembros que, con suficientes representantes, pueden editar/votar otros hilos, y de forma predeterminada pueden responder y tener los mismos privilegios que los invitados
- administradores que pueden usar m Haga cualquier cosa
Me gustaría que esta ACL se aplicara en todo el sitio, y denegará por defecto todos los recursos.
Leí los conceptos básicos del uso de Zend_Acl, básicamente creando roles (invitado, miembro, administrador) y denegando o permitiendo recursos (controladores, métodos) a esos roles. La documentación no es muy específica de cómo en realidad se debe aplicar el código ACL en su aplicación, por lo que fue a buscar el SO ..
se encontró con un stackoverflow muy útil answer from marek la que arroja algo de luz sobre el tema, sin embargo debido a mi falta de familiaridad, todavía no puedo entender completamente cómo implementar esto correctamente con las mejores prácticas en mente.
El cartel tiene un archivo estático configAcl.php
en la raíz de la aplicación que inicializa el objeto ACL, añade papeles, crea un recurso de cada controlador, da admin
acceso a todo, da normal
acceso a todo, pero el administrador y almacena el acl objeto en el registro para su uso posterior.
$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);
Pregunta # 1 - En caso de que el código sea en el arranque, o en un archivo independiente como ésta? Si es así, ¿sería mejor si estuviera dentro, por ejemplo, el directorio de la biblioteca?
La segunda parte es una nueva clase que amplía la clase Zend Controller Plugin Abstract que permite engancharla en auth/login
, la lógica es básicamente si el inicio de sesión falla, redirige ... de lo contrario, toma el objeto acl del registro, capta la identidad y determina si el usuario puede ver este recurso.
$identity = $auth->getIdentity();
$frontController->registerPlugin(new AuthPlugin());
Pregunta # 2 - ¿Cómo funciona exactamente iba a codificar la parte del complemento auth que realmente devuelve la identidad del usuario? Me di cuenta de que tenía un código debajo que generaba un objeto Auth adapter db table que consultaba la columna de la tabla de la base de datos por ID de usuario y credencial (verificación de paso hash). Estoy confundido sobre dónde encaja esto con la parte getIdentity.
Digamos que mi tabla de usuarios se compone de estos datos:
user_id user_name level
1 superadmin 3
2 john 2
3 example.com 1
Cuando el nivel 3 = admin, 2 = miembro, 1 = invitado.
Pregunta # 3 - ¿dónde exactamente es un buen lugar para poner el código de autorización anterior? ¿Dentro del controlador de inicio de sesión?
Pregunta # 4 - otro cartel replies con su artículo sobre cómo la lógica ACL debe hacerse dentro de los modelos, sin embargo, el método específico que utiliza no es compatible de forma nativa y requiere una solución, es esto posible? ¿Y es así como idealmente debería hacerse?
Impresionante, te agradezco el tiempo que tardaste en pegar todo eso. Trataré de implementarlo y te lo haré saber, gracias de nuevo. –
escribir correo electrónico. (google, solo) :) – SMka
bien, esto es mucho mejor de lo que he pensado. Sin embargo, una pregunta. ¿Por qué el objeto acl en App_Plugin_Auth no se recupera del registro donde lo has ubicado? gracias por la publicación –