Chiedo aiuto su configurazione ACL e metodo preDispatch()

Salve a tutti,essendo novello ho un nuovo intoppo nel mio studio su zend framework, ho l'oggetto zend_register::get(''auth") completo di autenticazione sessione e tutto,ho fatto delle prove e funziona benissimo.

Adesso stò configurando un plugin per la gestione dei privilegi degli utenti, e quì stò finendo di impazzire, allroa ho la seguente classe nel file:    CustomGestAuthIdentity.php   incluso nell'applicazione:

<?php
class CustomControllerAclManager extends Zend_Controller_Plugin_Abstract{
    
                       //ruolo predefinito in assenza di accesso o non valido
    private $_defaultRole = 'guest';
    private $auth;
    private $acl;

                        //azione da eseguire se un utente non ha i privilegi suffienti
    private $_authController=array('controller' => 'account','action' => 'login');

    public function __construct(Zend_Auth $auth){
        $this->auth = $auth;
        $this->acl = new Zend_Acl();
        
                                                    //aggiungiamo i diversi ruoli utenti
        $this->acl->addRole(new Zend_Acl_Role($this->_defaultRole));
        $this->acl->addRole(new Zend_Acl_Role('member'));
        $this->acl->addRole(new Zend_Acl_Role('administrator'),'member');
        $this->acl->addResource(new Zend_Acl_Resource('account'));
        $this->acl->addResource(new Zend_Acl_Resource('admin'));

        //impostazione prededfinita consentiamo a tutti gli utenti l'accessos a tutto tranne l'area amministrazione e gestione degli account
        $this->acl->allow();
        $this->acl->deny(null,'account');
        $this->acl->deny(null,'admin');
                                                          //aggiungiamo le risorse da controllare
        //eccezione per consentire login o registrazione,recupero password,e conferma registraziobne
        $this->acl->allow('guest','account','login');

        //eccezione per consentire ai membri di modificare i dati loro account
        $this->acl->allow('member','account');

        //consentiamo agli ammininstratori l'accesso all'area amministrazione
      //  $this->acl->allow('administator', 'admin');

    }

   /*
    * preDispatch
    * Prima di unì'azione verifica se un utente ha i privilegi per iniziare quell'azione,diversamente dispone un'azione predefinita: $_authController
    *
    *   @param Zend_Controller_Request_Abstract $request
    */

    public function preDispatch(Zend_Controller_Request_Abstract $request){

//verifica se l'utente ha eseguito l'accesso e ha un ruolo valido per l'azione, diversamente assegna un ruole predefinito(ospite)
        if($this->auth->hasIdentity())
                $role = $this->auth->getIdentity()->tipo_utente;
        else
            $role = $this->_defaultRole;

        if(!$this->acl->hasRole($role))
                $role = $this->_defaultRole;

        //la risorsa ACL è il nome del controller richiestp
        $resource = $request->controller;

        //il privilegio ACL è il nome dell'azione richiesta

        $privilege = $request->action;

        //se la risorsa bnon è stata aggiunta i nmodo esplicito, verifica le autorizzazioni globali predefinite
        if(!$this->acl->has($resource))
                $resource = null;

        //con accesso negato reinstradiamo la richiesta al gestore di azioni predefinito
        if(!$this->acl->isAllowed($role,$resource,$privilege)){
            exit('ciao');
            $request->setControllerName($this->_authController['controller']);
            $request->setActionName($this->_authController['action']);           
        }
    }
}

nel controller NEWS e precisamente nella Action init() ho il seguente codice <?php public function init(){      $auth = zend_registry::get('auth');      $session = $auth->getIdentity();      $front = Zend_Controller_Front::getInstance();      $front->getPlugin(new CustomControllerAclManager($auth));   }

La'zione di questo codice è questa:

l'utente non loggato, nella indexAction del sito visualizza alcune news, e quando clicca sull'opzione modifica accede all' Action edit del controller NEWS, passa ovviamente prima per init, che chiamando come plugin questa classe sopra, il preDispatch in base alle ACL decide se l'utente ha i privilegi di accedere all' editAction o no, in questo caso non essendo loggato, il preDispatch mi dovrebbe spostare il flusso del front sull'action login del controller account...

Il mio problema è che non fà precisamente niente, ho provato con un echo di prova, e ho visto che nel preDispatch non arriva proprio... Quest'impostazione l'ho trovata uguale più o meno su un libro e su un sito,ho provato tutto,ma niente...

Ki mi dice qualcosa??????

inviato 6 anni fa
superson_16
modificato 6 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Non c'è nessuno che sà darmi una spiegazione a questo problema??

risposto 6 anni fa
superson_16
X 0 X

Ciao Superson, credo che dovresti leggere più accuratamente la Documentazione dello Zend Framework relativa ai Plugin.

Infatti il tuo problema a prima vista sembra essere dovuto all'errata registrazione del plugin.

Non è nel metodo ::init dei tuoi controller che devi registrare il plugin, ma nel file di Bootstrap.

Quindi per registrare la tua classe CustomControllerAclManager come plugin, nel file Bootstrap devi aggiungere:

$frontController->registerPlugin(new CustomControllerAclManager($auth));

Solo in questo modo il Front Controller sarà in grado di chiamare il metodo ::preDispatch prima di avviare il dispatch del Controllo richiesto, dando la possibilità al tuo plugin di dirottare la richiesta.

Una nota a margine: La definizione della Access Control List non dovrebbe essere delegata al Plugin che verifica l'autenticazione dell'utente e lo reindirizza.

Ciao

:bye:

risposto 6 anni fa
Andrea Turso
Andrea Turso
86
modificato 6 anni fa
X 0 X

Oppure, in modo ancora più semplice/comodo, nel file di configurazione:

resources.frontcontroller.plugins = "CustomControllerAclManager"

Anche se ti suggerirei di usare una cartella sotto library per le tue classi personalizzate, e rispettare la nomenclatura delle classi in stile zend framework. Nel tuo caso:

library/My/Plugin/CustomControllerAclManager

Ciao!

risposto 5 anni fa
Luca450Mhz
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda