Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Пример будет внутри модуля 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);
    }
}

Ответ 2

В 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....
}

Ответ 3

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

Ответ 4

Люди,

Совет, не забудьте добавить "использовать", чтобы исправить инструкцию RouteMatch:

use Zend\Mvc\Router\Http\RouteMatch;

Здесь нужно следующее:

if (!$match instanceof RouteMatch)...

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

Ответ 5

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

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

    return parent::onDispatch($e);
}

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