editar: esto es un complemento de @singles response.
Debe comprender que hay 2 cosas diferentes. Auth y Acl. Auth le dice quién es el usuario y puede, por ejemplo, redirigir al usuario que no tiene autenticación a su controlador de inicio de sesión y establecer una identidad de autenticación después del inicio de sesión. entonces el sistema Acl aceptar un sí/no hay decisiones basadas en los datos de autenticación de acceso (podría ser el ID de usuario o es papel, almacenada en el almacenamiento de autenticación.
En buena solución es tener 2 controladores de plugins (registrada en el buen ordenar en el bootstrap, Auth y Acl). Si no usa los complementos de Controller, deberá llamar a Acl check en cada controlador, cuando sea necesario. Si siempre lo necesita, use complementos.
Implemente el preDispatch()
en usted Auth plugin para establecer, por ejemplo, una identidad anónima si no tiene un retorno de identidad de Zend_Auth. Este es un fragmento de código de uno de verdad:
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$module = $request->getModuleName();
$controller = $request->getControllerName();
$action = $request->getActionName();
$auth = Zend_Auth::getInstance();
if (!$auth->hasIdentity()) {
// set a default anonymous identity
$auth->getStorage()->write(array('name' => 'anonymous','role' => 1,));
}
(...)
Y para el Acl controlador plug-in la tarea es así en preDispatch()
. Puede iniciar una comprobación de acl para cada URL solicitada (por lo que para cada solicitud de usuario, incluso ajax). He aquí un fragmento parcial, por lo que este sólo un ejemplo de cómo se puede manejar las cosas:
public function preDispatch(Zend_Controller_Request_Abstract $request) {
$controller = $request->controller;
$module = $request->module;
$action = $request->action;
// here you should code something nice retrieving you Zend_Acl object
// with some caching options maybe, building roles, ressources, etc
$this->_acl = $this->getAcl();
if (!$this->_acl->isCurrentUserAllowed($module,'see')) {
$auth = Zend_Auth::getInstance();
$identity = $auth->hasIdentity('identity')? $auth->getIdentity() : null;
if(isset($identity)) {
if($identity['name'] == 'anonymous') {
// WARNING: avoid infinite redirect loops on login page
if (!($request->getControllerName() == 'login'
&& $request->getActionName()=='login'
&& $request->getModuleName() == 'default')) {
$request->setControllerName('login')
->setActionName('login')
->setModuleName('default');
return;
(...)
y en este sistema la última parte importante es la LoginController donde, en caso de inicio de sesión exitoso debe initate el registro de identidad:
(...)
$auth = Zend_Auth::getInstance();
Zend_Session::regenerateId();
$storage = $auth->getStorage();
$rowobject = $authAdapter->getResultRowObject(null,'passwd');
$storage->write((array)$rowobject);
(...)
Buenos ejemplos. +1 – singles
+1 me gusta la idea del usuario 'anónimo', y prometo que lo usaría en mis trabajos :) – tawfekov
@singles gracias, ¡esta es la solución que estaba buscando! –