Problemi con tutto :D

Ciao Gianni, dovrei scrivere un sito con lo ZF per motivi di lavoro ... certo sto avendo qualche problema,ma comunque grazie alla documentazione riesco a sbrigarmela, quasi sempre :D, sottolineo il quasi  ^-^

il mio problema è dato dalla mia scarsa conoscenza dello ZF, in pratica nel sito dovranno esserci diverse risorse, accessibili solo a diversi tipi di utenti:

ad esempio:

/url

 { autorizzazione necessaria per l'azione

/structures
   /view/id/n/ 
      { guest
      { admin
      { registred
      { staff
   /edit/id/n/
      { staff
      { admin
   /delete/id/n/
      { staff
      { admin
/customers
   /login
   /panel
      { registred
      { staff
      { admin
/admin
   { admin

/contents
   /view/id/n/
      { guest
      { admin
      { registred
      { staff
   /edit/id/n/
      { staff
      { admin
   /delete/id/n/
      { staff
      { admin

il gruppo dell'utente è contenuto nella tabella utenti

( id, user, pass, email, gruppo, dati, updatedon, createdon )

ma sto avendo seri problemi ad utilizzare :

Zend_Auth per creare una sessione persistente ( anche la sessione va bene, che lo fa di default il modulo stesso, solo che a quando pare, non funzia )

Zend_Acl per la gestione dei permessi.

e come se non bastasse s'è messo anche Zend_Filter_Input a farmi uscire pazzo tutta la notte, sarà una settimana che non dormo!!!

 :giveup: :wallbash: :sleep:

 :bye:

inviato 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X
risposto 9 anni fa
Gianni Tomasicchio
X 0 X

wow, non avevo mai dato un'occhiata alla dev zone :D

vedo se riesco poi ti faccio sapere, grazie comunque, non avrei mai cercato lì !!!

:bye:

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Ok ora il mio file di bootstrap è così :

index.php

<?php

define('BASE_URL', str_replace('index.php', '', $_SERVER['PHP_SELF']));
set_include_path(get_include_path().';'.'.\application\library'.';'.'.\application\models');
date_default_timezone_set('Europe/Rome');

require_once 'Zend/Loader.php';
require_once 'auth.php';

Zend_Loader::registerAutoload();

class SiS_Acl extends Zend_Acl
{
   public function __construct(Zend_Auth $auth) 
   {
      //parent::__construct();
      
      $this->add(new Zend_Acl_Resource('news'));      
      $this->add(new Zend_Acl_Resource('index'));
      $this->add(new Zend_Acl_Resource('admin'));
      $this->add(new Zend_Acl_Resource('search'));
      $this->add(new Zend_Acl_Resource('contents'));
      $this->add(new Zend_Acl_Resource('customers'));
      $this->add(new Zend_Acl_Resource('structures'));
      
      $this->addRole(new Zend_Acl_Role('guest'));
      $this->addRole(new Zend_Acl_Role('member'), 'guest');
      $this->addRole(new Zend_Acl_Role('staff'), 'member');
      $this->addRole(new Zend_Acl_role('admin'));      
      
      $opts = array('edit', 'new', 'delete');
      $this->allow('guest', 'news');
      $this->allow('guest', 'search');
      $this->allow('guest', 'contents');
      $this->allow('guest', 'structures');
      $this->allow('member', 'customers');
            
      $this->allow('staff', 'news');
      $this->allow('staff', 'contents');
      $this->allow('staff', 'structures');
      
      $this->allow('admin');
      
      $this->deny('staff', 'admin');
      $this->deny('guest', 'news', $opts);
      $this->deny('guest', 'contents', $opts);
      $this->deny('guest', 'structures', $opts);
      $this->deny('guest', 'admin');
   }
}

try {
   $options = array(/*omesso*/);
   $db = Zend_Db::factory('Pdo_Mysql', $options);
   $db->getConnection();   
} catch (Zend_Db_Adapter_Exception $e) {
   die("Zend_Db_Adapter_Exception: " . $e->getMessage());
} catch (Zend_Exception $e) {
   die("Zend_Exception: " . $e->getMessage());
}
$auth = Zend_Auth::getInstance();
$acl = new SiS_Acl($auth);
$router = new Zend_Controller_Router_Rewrite;
$translate = new Zend_Translate('gettext', 'application/languages/it/LC_MESSAGES/default.mo', 'it');

Zend_Registry::set('db', $db);
Zend_Registry::set('lang', $translate);   

$front = Zend_Controller_Front::getInstance();
$front->throwExceptions(true);
$front->setRouter($router)
      ->setDispatcher(new Zend_Controller_Dispatcher_Standard())
      ->registerPlugin(new Sis_Auth_Plugin($auth, $acl))
      ->setParam('auth', $auth)
      ->dispatch();

auth.php

<?php

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

class SiS_Auth_Plugin extends Zend_Controller_Plugin_Abstract
{
   private $_auth;
   private $_acl;

   private $_noauth = array(
                     'controller' => 'Customers',
                     'action'     => 'login'
                     );

   private $_noacl = array(
                     'controller' => 'error',
                     'action'    => 'privileges'
                     );

   public function __construct($auth, $acl)
   {      
      $this->_acl = $acl;
      $this->_auth = $auth;
   }

   public function preDispatch($request)
   {
      if ($this->_auth->hasIdentity()) {
         $role = $this->_auth->getIdentity()->getUser()->role;
      } else {
         $role = 'guest';
      }
            
      $action = $request->action;
      $resource = $controller;
      $controller = $request->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->setControllerName($controller);
         $request->setActionName($action);
   }
}

ma mi dà un'errore :

Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (Customers)' in F:\Programmi\Apache Software Foundation\Apache2.2\htdocs\incomingsalento\application\library\Zend\Controller\Dispatcher\Standard.php:193 Stack trace: #0 F:\Programmi\Apache Software Foundation\Apache2.2\htdocs\incomingsalento\application\library\Zend\Controller\Front.php(911): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 F:\Programmi\Apache Software Foundation\Apache2.2\htdocs\incomingsalento\index.php(80): Zend_Controller_Front->dispatch() #2 {main} thrown in F:\Programmi\Apache Software Foundation\Apache2.2\htdocs\incomingsalento\application\library\Zend\Controller\Dispatcher\Standard.php on line 193

aiuto ?

la mia confusione aumenta ogni attimo di più!

 :bye:

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

ok ho risolto in parte.

Per il login ho utilizzato Zend_Auth_Adapter_DbTable, ora in quel tutorial dicono che il ruolo dell'utente lo hanno come proprietà pubblica della classe ... ma a me non lo ritorna nulla , mi tocca estrarre i dati dal database utilizzando l'username di getIdentity?

Ma facendo così l'approccio è corretto ?

:bye:

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

mmh riscritto un po di codice da capo per controllare bene :

index.php

<?php
/*
 * Bootstrap File 
 * Salento Incoming Service
 */
define('BASE_URL', str_replace('index.php', '', $_SERVER['PHP_SELF']));
set_include_path(get_include_path().';'.'.\app\Libs'.';'.'.\app\MVC\Models');

/*
 * Sis_Auth_Plugin
 * authorization plugin
 */
require_once 'app/Plugins/Auth.php';

/*
 * Sis_Acl
 * Zend_Acl extensions
 */
require_once 'app/Plugins/Acl.php';

/*
 * Zend_Loader 
 * Loads automatically all called classes
 */
require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
try {

   $config = new Zend_Config_Xml('app/Config/config.xml', 'main');
   $options = array(
            'host'     => $config->database->host,
            'username' => $config->database->username,
            'password' => $config->database->password,
            'dbname'   => $config->database->name
            );

   $db = Zend_Db::factory($config->database->type, $options);
   $db->getConnection();   
} catch (Zend_Congig_Xml_Exception $e) {
   die("<strong>Zend_Congig_Xml_Exception : </strong>" . $e->getMessage());
} catch (Zend_Db_Adapter_Exception $e) {
   die("<strong>Zend_Db_Adapter_Exception : </strong>" . $e->getMessage());
} catch (Zend_Exception $e) {
   die("<strong>Zend_Exception : </strong>" . $e->getMessage());
}

try {
   $lang = new Zend_Translate('gettext', 'app/Languages/It/it.mo', 'it');
   $auth = Zend_Auth::getInstance();
   $myAcl = new Sis_Acl($auth);
   
   Zend_Registry::set('db', $db);
   Zend_Registry::set('lang', $lang);

   $controller = Zend_Controller_Front::getInstance();
   $controller ->setControllerDirectory('app/MVC/Controllers')
              ->setRouter(new Zend_Controller_Router_Rewrite)
            ->setDispatcher(new Zend_Controller_Dispatcher_Standard())
            ->registerPlugin(new Sis_Auth_Plugin($auth, $myAcl))
            ->setParam('auth', $auth)
            ->setParam('noViewRenderer', false)
            ->dispatch();

//   Zend_Controller_Front::run('app/User/Controllers');
         
} catch (Zend_Controller_Front_Exception $e) {
   die("<strong>Zend_Controller_Front_Exception :</strong> " . $e->getMessage());
}

acl.php

<?php

require_once 'Zend/Acl.php';

class Sis_Acl extends Zend_Acl
{
   public function __construct(Zend_Auth $auth) 
   {      
      $this->add(new Zend_Acl_Resource('news'));      
      $this->add(new Zend_Acl_Resource('index'));
      $this->add(new Zend_Acl_Resource('admin'));
      $this->add(new Zend_Acl_Resource('search'));
      $this->add(new Zend_Acl_Resource('contents'));
      $this->add(new Zend_Acl_Resource('customers'));
      $this->add(new Zend_Acl_Resource('structures'));
      
      $this->addRole(new Zend_Acl_Role('guest'));
      $this->addRole(new Zend_Acl_Role('member'), 'guest');
      $this->addRole(new Zend_Acl_Role('staff'), 'member');
      $this->addRole(new Zend_Acl_role('admin'));   
         
      $this->allow('guest', array('news', 'structures'));
      $this->allow('admin');

   }
}

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('controller' => 'customers',
                             'action'      => 'login');

    private $_noacl = array('controller' => 'error',
                            'action'     => 'privileges');
   
    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()) {
            $select = $this->_db->select()
                           ->from('users', 'group')
                           ->where('name=?', $this->_auth->getIdentity());
            $result = $this->_db->fetchAll($select);
            $role = $result[0]['group'];            
         } else {
            $role = 'guest';
         }

         $action = $request->action;
         $resource = $controller;
         $controller = $request->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->setControllerName($controller);
            $request->setActionName($action);
   }
}

ma non funziona ... non vanno i permessi ... o allow ( tutto ) per un utente o niente :D cioè devo permettere tutto ad ogni utente  altrimenti non funziona,non mi permette di gestire le autorizzazioni in base alla zona...

 :giveup: :sleep:

:bye:

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Gianni mi potresti dare una manina???

:bye:

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

RISOLTO!!! :2funny:

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

 O0 :bye:

P.S.: scusa se non ho contribuito ma sono parecchio impegnato...

risposto 9 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda