Есть ли простое решение для реализации стратегии рендеринга 403 в Zend Framework 2?

Я установил простой модуль ACL как плагин контроллера. Теперь я хотел бы реализовать «стратегию рендеринга 403», чтобы для «deny» я просто установил ответ 403, и было бы визуализировано представление «error / 403» из template_map. Функциональность должна соответствовать оригинальной стратегии 404.

Я взглянул на Zend\Mvc\View\Http\RouteNotFoundStrategy, но обнаружил, что он немного полноват. Есть ли более простой способ сделать это?


person Toni    schedule 09.02.2013    source источник
comment
Просматривали ли вы BjyAuthorize (github.com/bjyoungblood/BjyAuthorize) перед тем, как задать этот вопрос? Он довольно полный и предоставляет вам достойную неавторизованную стратегию ...   -  person Ocramius    schedule 11.02.2013
comment
@ Окрамиус, да, это было так. Это довольно приятно, и я думаю, что это решит проблему. Но может быть есть другое (меньшее) решение? Как и в ZF1 - там вы можете просто изменить контроллер и действие в запросе, и 403 будет поднят.   -  person Toni    schedule 13.02.2013
comment
В ZF2 исключения приложений могут обрабатываться с помощью слушателей, прикрепленных к одному из Zend\Mvc\MvcEvent::EVENT_*_ERROR событий диспетчера событий Zend\Mvc\Application. Подойдет и простое закрытие: $app->getEventManager()->attach('dispatch.error', function () { die('application error!'); );   -  person Ocramius    schedule 13.02.2013


Ответы (2)


Вы можете взглянуть на SlmErrorException, автором которого я являюсь. Это позволяет вам генерировать исключения, которые отмечены интерфейсом исключения. Этот интерфейс определяет, будет ли установлен код состояния 40x или 50x и какой шаблон ошибки будет отображен.

Вы можете создать собственное исключение

namespace MyModule\Exception;

use SlmErrorException\Exception\UnauthorizedInterface;

exception UnauthorizedUserException
    extends \Exception
    implements UnauthorizedInterface
{
}

Затем вы генерируете исключение где-нибудь в своем коде, и модуль проверяет, реализует ли выброшенное исключение какой-либо из известных интерфейсов. Затем будет установлен код состояния (в данном случае 403) и будет отображено представление error/unauthorized.

Этот модуль находится в разработке и не готов к производству. Но вы можете взглянуть и посмотреть, подходит ли он. Возможно, вы сможете внести свой вклад в стабилизацию и помочь в написании тестов, чтобы их могло использовать больше людей.

person Jurian Sluiman    schedule 09.02.2013

Вот решение без использования сторонних модулей.

Вы можете создать собственное событие, которое при срабатывании будет устанавливать желаемый шаблон в шаблоне (пожалуйста, прочтите комментарии к коду):

public function onBootstrap(MvcEvent $e)
{
    $eventManager = $e->getApplication()->getEventManager();

    $eventManager->getSharedManager()->attach('custom', '403', function(MvcEvent $event) use($eventManager){

        //set the 403 template you have previously prepared
        $viewModel = new ViewModel();
        $viewModel->setTemplate('error/403');

        $appViewModel = $event->getViewModel();
        $appViewModel->setTemplate('layout/layout');//set the default layout (optional)
        $appViewModel->addChild($viewModel, 'content');//add the 403 template to the app layout

        //prevent the MvcEvent::EVENT_DISPATCH to fire by calling it
        //with high priority (100) and using $event->stopPropagation(true);
        $eventManager->attach(MvcEvent::EVENT_DISPATCH, function(MvcEvent $event) {
            $event->stopPropagation(true);
        }, 100);
    });
}

И затем вы можете вызвать это событие из любого места кода:

$e = new \Zend\Mvc\MvcEvent();
$eventManager = new \Zend\EventManager\EventManager('custom');
$eventManager->trigger('403', $e);
person vivanov    schedule 29.04.2016