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);
}
}
fonte
2013-01-03 11:35:48
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'. –
è necessario modificare 'nuova risposta' a' $ e-> getResponse() 'quindi funziona perfettamente! – Ron
Grazie per averlo risolto. Ho aggiornato la mia risposta di conseguenza per riferimento futuro :) –