Zend Framework 2 – глобальная проверка подлинности с помощью ZFCUser

Я успешно установил ZFCUser . Теперь я задаюсь вопросом, есть ли способ глобально проверить подлинность.

Как указано в вики, существует несколько способов проверить auth. Они все работают, но я должен поместить чек-if-предложение действительно в каждое действие? Все мои сайты должны быть доступны только при входе в систему, а если нет, вы должны перенаправляться на страницу входа.

Кто-нибудь знает, есть ли центральное место, где я могу поставить эту логику?

Solutions Collecting From Web of "Zend Framework 2 – глобальная проверка подлинности с помощью ZFCUser"

Честно говоря, я не думаю, что это хорошая идея, чтобы блокировать каждую страницу для пользователя, не прошедшего проверку подлинности. Как вы получите доступ к странице входа?

Тем не менее, вы должны знать, что страница доступна, чтобы сделать белый список страниц доступным для анонимных посетителей. Для начала я бы предложил включить страницу входа в систему. Вы можете проверять страницы проще всего, используя свой маршрут. Поэтому проверьте текущий сопоставленный маршрут с белым списком. Если заблокирован, действуйте. В противном случае ничего не делайте.

Пример будет внутри модуля Module.php из модуля, например вашего приложения:

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

На ZF 2.4.2 я делаю это в 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.... } 

Вы можете использовать модуль BjyAuthorize ZF2, чтобы блокировать / разрешать доступ к страницам на основе пользовательских ролей, таких как guest , user т. Д., Используя controller guard route guard т. Д.

Люди,

Совет, не забудьте добавить «использование» для исправления инструкции RouteMatch:

 use Zend\Mvc\Router\Http\RouteMatch; 

Здесь нужно:

 if (!$match instanceof RouteMatch)... 

Если вы забудете, то, если выше, непостоянны

Другим вариантом может быть создание собственного абстрактного суперкласса контроллера и реализация метода onDispatch () следующим образом:

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

Вы также можете реализовать белый список :).