php authentication zend-framework2 zfcuser

php - Zend Framework 2-Comprobación global para la autenticación con ZFCUser



authentication zend-framework2 (5)

Para ser sincero, no creo que sea una buena idea bloquear cada página para un usuario no autenticado. ¿Cómo accedería a la página de inicio de sesión?

Dicho esto, debe conocer la página a la que se está accediendo para hacer que una lista blanca de páginas sea accesible para visitantes anónimos. Para comenzar, sugiero incluir la página de inicio de sesión. Puede verificar las páginas de la manera más fácil usando su ruta. Por lo tanto, compruebe la ruta coincidente actual contra la lista blanca. Si está bloqueado, actúe de acuerdo. De lo contrario, no hagas nada.

Un ejemplo sería dentro de un Module.php de un módulo, por ejemplo su aplicación:

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); } }

Instalé ZFCUser éxito. Ahora me pregunto si hay una forma de verificar globalmente la autenticación.

Como se describe en la wiki, hay varias formas de verificar la autenticación. Todos funcionan pero ¿tengo que poner la cláusula check-if en cada acción? Todos mis sitios deben ser solo accesibles cuando se inicia sesión y si no, debe ser redirigido a la página de inicio de sesión.

¿Alguien sabe si hay un lugar central donde puedo poner esta lógica?


Otra opción podría ser crear su propia superclase de controlador abstracto e implementar el método onDispatch () como este:

public function onDispatch(MvcEvent $e) { // check authentication here return parent::onDispatch($e); }

Usted puede implementar una lista blanca allí también :).


En ZF 2.4.2 hago esto en 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.... }


Puede utilizar el módulo ZF2 BjyAuthorize para bloquear / permitir el acceso a las páginas en función de los roles de los usuarios, tales como guest , user , etc. utilizando el controller guard , route guard etc.


Gente,

Sugerencia: no olvide agregar el "uso" para corregir la declaración de RouteMatch:

use Zend/Mvc/Router/Http/RouteMatch;

Aquí necesito esto:

if (!$match instanceof RouteMatch)...

Si se olvida, el si anterior tiene inconstante