Actualmente estoy trabajando en un sitio que requiere el ACL y como estoy usando Zend, tiene sentido para mí hacer uso de su ACL clase, pero poco tengo cero idea de cómo hacerlo. He leído la documentación, pero me confunde más…básicamente todo lo que quiero hacer es configurar dos grupos de usuarios por ejemplo, «normal» y «admin», normal que los usuarios pueden acceder a todas las páginas que tienen un controlador que no es admin mientras admin, obviamente, puede tener acceso a la administración de la controladora páginas.

Tengo muchas preguntas:

  1. ¿Cómo puedo configurar esto?
  2. Se deben ejecutar a través de una base de datos o el archivo de configuración config.ini?
  3. Donde puedo colocar mi ACL.php?
  4. ¿Cómo se escribe una secuencia de comandos?
  5. ¿Cómo puedo llamar, es este hecho en el Índice?.

Yo aprecio mucho si usted me guía a un sitio web o un buen tutorial.

InformationsquelleAutor Udders | 2009-02-13

3 Comentarios

  1. 38

    He implementado algo similar no hace mucho tiempo. Concepto básico de la siguiente manera en un ejemplo de código.

    He creado mi propia configAcl.php archivo que se carga en el archivo de bootstrap, en mi caso es index.php. Aquí es cómo me gustaría ser de acuerdo a tu 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 el de si desea permitir que los usuarios normales sólo «lista» de acción en todos sus controladores. Es bastante simple, tendría que agregar una línea como esta:

    $acl->allow('normal', null, 'list'); //Has access to all controller list actions.

    A continuación debe crear nuevo plugin que se encarga de la comprobación de credenciales automáticamente cuando hay una petición de algún tipo de acción del controlador. Esta comprobación se lleva a cabo en preDispatch() método 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 son la carga de su configAcl.php y registrar el AuthPlugin en el archivo de bootstrap (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. Yo no probar el código anterior (copiar y pegar y volver a escribir sólo para el escaparate propósito) así que no es a prueba de balas. Sólo para dar una idea.

    EDITAR

    Para la claridad. El código de arriba en AuthPlugin supongamos que el $identidad de objeto se rellena con los datos de usuario («papel» de la columna en la base de datos). Esto podría llevarse a cabo en el proceso de inicio de sesión como esta:

    [...]
    $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);
    [...]
    • ¿Dónde ir en mi sitio de estructura? APLICACIÓN de modelos de controlador de vistas PÚBLICAS de imágenes css js BIBLIOTECA de flash zend algún consejo?
    • configAcl.php puede estar en cualquier lugar en el directorio de la Aplicación, es sólo para la inclusión en index.php. AuthPlugin debe estar en tu Biblioteca – así Zend es capaz de cargarlo automáticamente y usted no tiene que usar require_once. Las últimas declaraciones entre […] dependen de su proceso de inicio de sesión…
  2. 2

    Esta solución puede llegar a ser la más simple aplicación de Zend_Acl.

    Ejemplo:

    class UserController extends Zend_Controller_Action {
    
        public function preDispatch(){
    
            $resource = 'user_area';
            $privilege = $this->_request->getActionName();
            if (!$this->_helper->acl($resource, $privilege)) $this->_redirect();
    
        }
    
    }

    Zend/Controller/Action/Helper/Acl.php

    class Zend_Controller_Action_Helper_Acl extends Zend_Controller_Action_Helper_Abstract {
    
        protected $acl;
        protected $role;
    
        protected function getAcl(){
    
            if (is_null($this->acl)){
    
                $acl = new Zend_Acl();
    
                $acl->addResource(new Zend_Acl_Resource('user_area'));
                $acl->addResource(new Zend_Acl_Resource('customer_area'), 'user_area');
                $acl->addResource(new Zend_Acl_Resource('web_area'));
    
                $acl->addRole(new Zend_Acl_Role('guest'));      
                $acl->addRole(new Zend_Acl_Role('user'), 'guest');
    
                $acl->allow('guest', 'web_area');
                $acl->allow('guest', 'user_area', array(
                    'forgot-password',
                    'login'
                ));
                $acl->allow('user', 'user_area');
                $acl->allow('customer', 'customer_area');
    
                $this->acl = $acl;
    
            }
    
            return $this->acl;
    
        }
    
        protected function getRole(){
    
            if (is_null($this->role)){
    
                $session = new Zend_Session_Namespace('session');
                $role = (isset($session->userType)) ? $session->userType : 'guest';
                $this->role = $role;
    
            }
    
            return $this->role;
    
        }
    
        public function direct($resource, $privilege = null){
    
            $acl = $this->getAcl();
            $role = $this->getRole();
            $allowed = $acl->isAllowed($role, $resource, $privilege);
            return $allowed;
    
        }
    
    }
  3. 2

    Jugar con Esta estructura . obtener papel y de los recursos de la base de datos y guardar esto en la sesión o cualquier almacenamiento en caché . Necesitan orientación para comenzar con Zend ACL

Dejar respuesta

Please enter your comment!
Please enter your name here