Nuovo

Ciao a tutti,

E' da poco che sto imparando il php e dopo aver letto il manulae on line e aver fatto un paio di cosette, adesso sto cercando di imparare un framework, e sapendo che zend è quello ufficiale mi ci sto buttando a capofitto.

ora però ho un problema, sto cercando di capire come funziona zend_auth e zend_acl ma se li prendo singolarmente (come classi) riesco a fare qualcosa ma se li inserisco nella action non capisco perchè mi funzionano in maniera anomala, spiego meglio, ho una pagina index.php che è una form con il login, ora io desidero che quando l'utente prema il tasto accedi deve partire una action che si chiama loginAction e che si trova in un altro file diverso da indexController.php, ma non funziona, se invece inserisco la action in indexController e nell'indexAction richiamo il loginAction allora funziona

spero di essere stato chiaro

grazie

inviato 9 anni fa
bramante
X 0 X

Penso che il problema non sia in zend_auth o zend_acl ma semplicemente nella action del form. Cosa hai messo?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

mmh allora questa è una cosa che ho affrontato io.

dunque, protresti fare così :

crea una cartella mieiPlugins nella cartella App ( o application ) del tuo sito

e metti questi due file :

Auth.php :

<?php

require_once 'Zend/Controller/Plugin/Abstract.php';

class Sis_Auth_Plugin extends Zend_Controller_Plugin_Abstract
{
    private $_auth;
    private $_acl;
   private $_db;

    private $_noauth = array('module'     => 'default', //lascia così
                      'controller' => 'customers', //CONTROLLER DEGLI UTENTI
                             'action'      => 'login'); //loginAction

    private $_noacl = array('module'     => 'default', //lascia così
                      'controller'  => 'error', //CONTROLLER ERRORI
                            'action'      => 'privileges'); //privilegesAction : qui metti un bel messaggio di privilegio non sufficente per eseguire l'azione
   
    public function __construct(Zend_Auth $auth, Zend_Acl $acl)
    {
      $this->_db = Zend_Registry::get('db');
        $this->_auth = $auth;
        $this->_acl = $acl;
    }

   public function preDispatch($request)
   {
      if ($this->_auth->hasIdentity()) {
            $role = $this->_acl->getRole($this->_auth->getIdentity());         
         } else {
            $role = 'guest';
         }
         
         $controller = $request->controller;
         $action = $request->action;
         $module = $request->module;
         $resource = $controller;
   
         if (!$this->_acl->has($resource)) {
            $resource = null;
         }
   
         if (!$this->_acl->isAllowed($role, $resource, $action)) {
            if (!$this->_auth->hasIdentity()) {
               $controller = $this->_noauth['controller'];
               $action = $this->_noauth['action'];
            } else {
               $controller = $this->_noacl['controller'];
               $action = $this->_noacl['action'];
            }
         }      
         $request->setModuleName($module);
         $request->setControllerName($controller);
         $request->setActionName($action);
   }
}

Questo gestisce l'autenticazione dell'utente.

----------------------------------------------

Acl.php :

<?php

require_once 'Zend/Acl.php';

class Sis_Acl extends Zend_Acl
{
   private $_db;
   private $_auth;
   
   public function __construct(Zend_Auth $auth, $db) 
   {   
      $this->_db = $db;         
      $this->_auth = $auth;
            
      $this->addRole(new Zend_Acl_Role('guest'))
          ->addRole(new Zend_Acl_Role('member'), 'guest')
          ->addRole(new Zend_Acl_Role('staff'), 'member')
          ->addRole(new Zend_Acl_role('admin'));   
          
      $this->add(new Zend_Acl_Resource('news'))      
          ->add(new Zend_Acl_Resource('index'))
          ->add(new Zend_Acl_Resource('booking'))
          ->add(new Zend_Acl_Resource('contents'))
          ->add(new Zend_Acl_Resource('customers'));
      $this->allow('guest', array('index', 'news', 'booking'));
      $this->allow('guest', null, 'view');
      $this->allow('guest', 'customers', array('index', 'login'));
      $this->allow('member', 'customers');
      $this->deny('guest', 'news', 'add');
      $this->deny('guest', 'news', 'edit');
      $this->deny('guest', 'news', 'delete');
      $this->allow('staff', null, array('edit', 'delete', 'add'));
      $this->allow('admin');
   }
   
   public function getRole($user = null)
   {
      if ($user == null) {   
         $user = $this->_auth->getIdentity();   
      }
         $select = $this->_db->select()
                  ->from('users', 'group')
                  ->where('name=?', $user);            
         $result = $this->_db->fetchAll($select);
         
         return $result[0]['group'] != false ? $result[0]['group'] : 'guest';   
   }

Questo file invece definisce le tue ACL, cioè i permessi dei vari utenti.

in questo caso il nome del Ruolo dell'utente si trova nel campo ROLE della tabella utenti.

------------------------------------------

poi al tuo file di bootstrap devi aggiungere questo :

   //A QUESTO PUNTO DEVI INCLUDERE I TUOI DUE PLUGIN

   $auth = Zend_Auth::getInstance();
   $myAcl = new Sis_Acl($auth, $db);
   
   $controller = Zend_Controller_Front::getInstance();
   $controller ->setControllerDirectory(CONTROLLER_DIR)
              ->setRouter(new Zend_Controller_Router_Rewrite) //a causa di questo ho passato 5 notti insonni :P
            ->registerPlugin(new Sis_Auth_Plugin($auth, $myAcl)) //registra il tuo plugin per la gestione delle autenticazioni
            ->setParam('acl', $myAcl) //qui passi come argomento un nome con il quale potrai invocare il tuo plugin e la sua istanza 
            ->setParam('auth', $auth) //qui invece passi l'istanza di Zend_Auth
            ->setParam('noViewRenderer', false)
            ->dispatch();

In questo modo il framework utilizzerà il tuo "plugin" prima del dispatch della pagina richiesta e controllerà i permessi dell'utente, se non ha i permessi necessari verrà reindirizzato alla pagina di login

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
modificato 9 anni fa
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda