2010-08-02 14 views
5

Attualmente sto utilizzando un plug-in controller Zend per controllare l'autenticazione. Quanto segue probabilmente sembra familiare:Gestione di Zend Errore di autenticazione tramite richiesta AJAX

class SF_Plugin_Member_Auth extends Zend_Controller_Plugin_Abstract { 

    public function preDispatch(Zend_Controller_Request_Abstract $request) { 

     if (!SF_Auth::getInstance('Member')->hasIdentity()) { 
      if ($request->getControllerName() !== 'auth' && $request->getControllerName() !== 'error') { 
       $r = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); 
       $r->gotoSimpleAndExit('login', 'auth', $request->getModuleName()); 
      } 
     } 
    } 
} 

Quello che io sono sicuro di è il modo migliore di trattare con una richiesta AJAX non autenticata. Quindi, dire che qualcuno tenta di accedere utilizzando un modulo inviato su AJAX, come dovrebbe sapere il Javascript che in realtà ha bisogno di reindirizzare l'utente alla pagina di accesso?

Il mio primo pensiero è verificare se la richiesta è una richiesta AJAX, quindi echo un oggetto JSON con i dettagli su dove reindirizzare l'utente: il Javascript può quindi cercare una particolare proprietà nel JSON restituito oggetto e usarlo come URL per "location.href" all'utente.

Ci sono due problemi con quanto sopra:

  1. io non sono sicuro di come fermare la richiesta di essere spedito - tutto quello che voglio fare è eco una semplice stringa JSON se si tratta di una richiesta AJAX.
  2. Non sembra un modo Zend di fare le cose.

C'è qualcuno là fuori che è stato colpito e ha risolto proprio questo scenario?

Grazie mille,

James.

+0

solito, se si sta facendo una richiesta AJAX, presumo che stai tornando un po 'di risposta standard (IG: {errore: 0, un messaggio: "ok", risposta: {}} - dove 'response' è l'oggetto di risposta effettivo dalla richiesta e 'error' e 'message' sono il codice di errore del server e il messaggio)? –

risposta

1

È possibile impostare i valori JSON nell'oggetto risposta e arrestare correttamente la richiesta con il redirector.

if (!SF_Auth::getInstance('Member')->hasIdentity()) { 
    if ($request->getControllerName() !== 'auth' && $request->getControllerName() !== 'error') { 
     if ($request->isXmlHttpRequest()) { 
      $json = Zend_Json::encode(array('auth' => false, 'url' => 'http://foo.bar/login')); 

      // Prepare response 
      $this->getResponse() 
       ->setHttpResponseCode(200) // Or maybe HTTP Status 401 Unauthorized 
       ->setBody($json) 
       ->sendResponse(); 

      // redirectAndExit() cleans up, sends the headers and stopts the script 
      Zend_Controller_Action_HelperBroker::getStaticHelper('redirector')->redirectAndExit(); 
     } else {   
      $r = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); 
      $r->gotoSimpleAndExit('login', 'auth', $request->getModuleName()); 
     } 
    } 
} 

Questa uscita qualcosa volontà di simile:

{"auth":false,"url":"http:\/\/foo.bar\/login"} 
Problemi correlati