Domanda

Ho appena creato un plugin per andare con il mio sito per assicurarsi che un utente è autenticato prima di eseguire un'azione. Questo è il plugin:

class Booze_Plugin_AclPlugin extends Zend_Controller_Plugin_Abstract{

public function preDispatch(Zend_Controller_Request_Abstract $request)
{
    $auth = Booze_Permissions_Auth::getInstance();
    $acl = Zend_Registry::get('acl');

    if(!$auth->hasIdentity())
    {
        $role = Booze_Permissions_Roles::GUEST;
    }
    else
    {
        $role = $auth->getUser()->role;
    }

    $resource = $request->getControllerName();
    $privilege = $request->getActionName();

    if(!$acl->isAllowed($role, $resource, $privilege))
    {
        Booze_Log::log("ACLPlugin: Sent to login");

        $request->setControllerName('login');
        $request->setActionName('index');
        $request->setDispatched(false);
    }
}

}

Sembra funzionare per le pagine che non sono asincrone. Tuttavia, ho un controller che è compito è quello di eseguire le funzioni asincrone. Questo è quel controller (parti rilevanti):

class AsyncController extends Zend_Controller_Action{

public function init()
{

    if(!$this->getRequest()->isXMLHttpRequest())
    {
        $this->_forward('index', 'index');
    }

    $this->_helper->viewRenderer->setNoRender();
    $this->_helper->getHelper('layout')->disableLayout();
 }

 public function addcommentAction()
 {
    $params = $this->getDecoded('comment', true);
    $params_array = (array)$params;

    $auth = Booze_Permissions_Auth::getInstance();
    if(!$auth->hasIdentity())
    {
        $this->getResponse()->setBody("Guest");
    }

    $params_array['user_id'] = $auth->getUser('user_id');
    $params_array['store_id'] = Booze_Storage::get('store_id');

    if($this->comments->insertComment($params_array))
    {
        $this->getResponse()->setBody("success");
    }
    else
    {
        $this->getResponse()->setBody("CommentFail");
    }
 }

Quando chiamo la funzione asincrona addcommentAction, anche quando ha firmato in qualità di ospite, non mi prendere per il controller di accesso. Ho, però, scoperto da Firebug, che sta inviando il codice html per il controller di accesso, ma solo che non sta rivelando nel mio browser. Nella mia mente questo deve avere qualcosa a che fare con il fatto che il controller asincrono ha, nel init, spento vista di rendering e layout. Ho provato scherzi con esso, e non riesco a capire un modo affidabile per assicurarsi che il reindirizzamento nel plugin rende sempre, e si vede. Qualsiasi aiuto sarebbe eccezionale.

È stato utile?

Soluzione

Vorrei aggiungere nella isAllowed () parte di questo plug-in:

if(!$acl->isAllowed($role, $resource, $privilege))
{
    if(!$this->getRequest()->isXMLHttpRequest())
    {
        //@todo getResponse
        $response->setBody(Zend_Json::encode(array('result'=>'fail', 'reason'=>'Need login');
        $response->sendResponse();
        exit;
    }

    Booze_Log::log("ACLPlugin: Sent to login");

    $request->setControllerName('login');
    $request->setActionName('index');
    $request->setDispatched(false);
}

che sulla vostra pagina di asincrona maniglia incloming JSON quando risultato è 'fallire'.

Altri suggerimenti

hai provato a fare un colpo di testa () reindirizzare? come:

$this->_helper->getHelper('Redirector')->setCode(303)
                                       ->setExit(false)
                                       ->setGotoSimple('index', 'login');

Edit: Come si sayd nel tuo commento, si vuole ricevere il codice html corretto (login) - non si poteva il check-in l'azione di login, se la richiesta è asincrona e restituire un codice di errore che poi gestire nella richiesta javascript codice?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top