2013-01-03 11 views
13

Ho installato con successo ZFCUser. Ora mi chiedo se c'è un modo per controllare a livello globale per l'autenticazione.Zend Framework 2 - Verifica globale per l'autenticazione con ZFCUser

Come delineato in the wiki ci sono diversi modi per verificare l'autenticazione. Funzionano tutti, ma devo davvero inserire la clausola check-if in ogni singola azione? Tutti i miei siti dovrebbero essere accessibili solo quando si è loggati e, in caso contrario, si dovrebbe essere reindirizzati alla pagina di accesso.

Qualcuno sa se c'è un posto centrale in cui posso mettere questa logica?

risposta

25

Per essere onesti, non penso sia una buona idea bloccare la pagina ogni per un utente non autenticato. Come accederai alla pagina di accesso?

Detto questo, è necessario conoscere la pagina a cui si accede, per rendere una whitelist di pagine accessibili per i visitatori anonimi. Per iniziare, suggerirei di includere la pagina di accesso. Puoi controllare le pagine nel modo più semplice usando il loro percorso. Quindi controlla l'attuale percorso abbinato alla whitelist. Se bloccato, agire. Altrimenti, non fare nulla.

Un esempio potrebbe essere all'interno di un Module.php da un modulo, ad esempio l'applicazione:

namespace Application; 

use Zend\Mvc\MvcEvent; 
use Zend\Mvc\Router\RouteMatch; 

class Module 
{ 
    protected $whitelist = array('zfcuser/login'); 

    public function onBootstrap($e) 
    { 
     $app = $e->getApplication(); 
     $em = $app->getEventManager(); 
     $sm = $app->getServiceManager(); 

     $list = $this->whitelist; 
     $auth = $sm->get('zfcuser_auth_service'); 

     $em->attach(MvcEvent::EVENT_ROUTE, function($e) use ($list, $auth) { 
      $match = $e->getRouteMatch(); 

      // No route match, this is a 404 
      if (!$match instanceof RouteMatch) { 
       return; 
      } 

      // Route is whitelisted 
      $name = $match->getMatchedRouteName(); 
      if (in_array($name, $list)) { 
       return; 
      } 

      // User is authenticated 
      if ($auth->hasIdentity()) { 
       return; 
      } 

      // Redirect to the user login page, as an example 
      $router = $e->getRouter(); 
      $url  = $router->assemble(array(), array(
       'name' => 'zfcuser/login' 
      )); 

      $response = $e->getResponse(); 
      $response->getHeaders()->addHeaderLine('Location', $url); 
      $response->setStatusCode(302); 

      return $response; 
     }, -100); 
    } 
} 
+0

Mmm, non è sicuro ... Ho scritto questo fuori di testa, in modo da provare ad abilitare gli errori php e imposta il livello di errore su -1 (ovvero, tutti gli errori) e scopri cosa c'è di sbagliato qui. Forse il router non può essere trovato, ma per quanto ne so il router si trova all'interno di '$ e' da' onBootstrap' ** e ** in '$ e' dal callback all'interno dell'evento di instradamento. In caso contrario, prova ad afferrare il router dal file '$ e' all'interno del metodo' onBoostrap() 'e importarlo come' 'list' e' $ auth'. –

+0

è necessario modificare 'nuova risposta' a' $ e-> getResponse() 'quindi funziona perfettamente! – Ron

+0

Grazie per averlo risolto. Ho aggiornato la mia risposta di conseguenza per riferimento futuro :) –

-3

Un'altra opzione potrebbe essere quella di creare il proprio superclasse controllore astratto e implementare il metodo onDispatch() in questo modo:

public function onDispatch(MvcEvent $e) 
{ 
    // check authentication here 

    return parent::onDispatch($e); 
} 

Anche qui è possibile implementare una whitelist :).

+1

Potrei sbagliarmi, ma penso che il metodo che intendi sia chiamato 'onDispatch'; – Tamlyn

+0

@ Tamlyn: certo che hai ragione, grazie! –

+0

Cos'è la whitelist ?? –

0

Su ZF 2.4.2 Lo faccio in Module.php

class module { 

protected $whitelist = array(
    'Application\Controller\Login' 
); 

public function onBootstrap(MvcEvent $e) 
{ 

    $eventManager  = $e->getApplication()->getEventManager(); 
    $moduleRouteListener = new ModuleRouteListener(); 
    $moduleRouteListener->attach($eventManager); 

    // add event 
    $eventManager->attach('dispatch', array($this, 'checkLogin')); 

} 

public function checkLogin($e) 
{ 

    $auth = $e->getApplication()->getServiceManager()->get("Zend\Authentication\AuthenticationService"); 
    $target = $e->getTarget(); 
    $match = $e->getRouteMatch(); 

    $controller = $match->getParam('controller'); 

    if(!in_array($controller, $this->whitelist)){ 
     if(!$auth->hasIdentity()){ 
      return $target->redirect()->toUrl('/login'); 
     } 
    } 

} 

//other methods.... 
} 
0

È possibile utilizzare il modulo ZF2 BjyAuthorize per bloccare/consentire l'accesso alle pagine basate su ruoli utente, come guest, user ecc utilizzando controller guard, route guard ecc

0

persone,

Tip, non dimenticare il aggiungere l ' "uso" per correggere RouteMatch dichiarazione:

use Zend\Mvc\Router\Http\RouteMatch; 

Qui bisogno di questo:

if (!$match instanceof RouteMatch)... 

Se si dimentica, il caso di cui sopra sono incostanti