Как пропустить действия контроллера в случае неудачной авторизации в ZF2

Я реализую REST API на ZF2. Теперь мне нужно проверить токен авторизации на Module.php и вернуться с ошибкой, если авторизация не удалась. Но я не знал, как вернуть ответ из Module.php.

Я написал код для проверки авторизации в событии DISPATCH onBootstrap. Теперь, как вернуть ошибку из Module.php без доступа к контроллерам, если авторизация не удалась. Поскольку только exit функция/вызов позволяют вернуться без доступа к контроллеру. Но в этом случае я не получил никакого ответа. Использование json_encode(array) не похоже на стандарт, так как я уже включил ViewJsonStrategy и использую JsonModel в контроллерах.


person kuldeep.kamboj    schedule 30.01.2013    source источник
comment
См. title="zend framework 2, как разместить перенаправление в модуль перед приложением"> stackoverflow.com/questions/14169699/   -  person yechabbi    schedule 30.01.2013


Ответы (1)


Вы можете сократить событие, если ваш слушатель вернет ответ, например...

public function onBootstrap(EventInterface $e)
{
    $eventManager = $e->getApplication()->getEventManager();
    // attach dispatch listener 
    $eventManager->attach('dispatch', function($e) {
        // do your auth checks...
        if (!$allowed) {
            // get response from event
            $response = $e->getResponse();
            // set status 403 (forbidden) 
            $response->setStatusCode(403);
            // shortcircuit by returning response
            return $response;
        }
    });
}
person Crisp    schedule 30.01.2013
comment
Что ж, этот подход будет работать, но проблема все еще существует. Мне нужно отправить сообщение об ошибке, но все, что я могу использовать $response->setContent($data). Теперь это передается как text/html. Даже использование заголовков application/json не работает. Таким образом, единственный способ отправить необходимую информацию — использовать json_encode для данных, таких как $response->setContent(json_encode($data)). Теперь я уже включил ViewJsonStrategy, но мне все еще нужно добавить json_encode. - person kuldeep.kamboj; 30.01.2013
comment
Что ж, после дополнительного анализа я обнаружил, что запрос все еще поступает в контроллер, поэтому там выполняется код. Похоже, что из Module.php установлен только ответный пакет. В остальном вся сцена осталась прежней :( - person kuldeep.kamboj; 30.01.2013
comment
После закрытия попробуйте добавить третий параметр со значением 100. Если я правильно понимаю, это приведет к тому, что событие отправки произойдет до действия контроллера. Также стоит посмотреть код событий здесь: mwop.net/blog/2012-07-30-the-new-init.html - person DrBeza; 30.01.2013
comment
Проверка спустя много времени, да, это работает (однако теперь это будет сценарий для доступа к объекту контроллера $e->getTarget()). - person kuldeep.kamboj; 06.02.2013