Zend Framework: плагин preDispatch ACL вызывает запросы к несуществующей странице для отказа в доступе вместо 404 - PullRequest
5 голосов
/ 06 августа 2010

Я установил плагин preDispatch для моего ACL.Я использовал контроллер в качестве ресурса, действие в качестве привилегии.Когда я пытаюсь перейти на несуществующую страницу, я получаю страницу отказа в доступе вместо 404, я думаю, что ресурс и привилегия запрашиваются, а поскольку они не найдены, он переходит на страницу запрещенного доступа ...

как я могу это исправить?может быть, мой метод реализации плагина был неправильным?Могу ли я как-то проверить наличие ресурса b4, который запускает мой плагин acl?\

обновление

код плагина @ pastebin

Ответы [ 4 ]

4 голосов
/ 06 августа 2010

У меня была такая же проблема, и я добавил ее к функции preDispatch (хотя и с использованием модулей, но интересна функция $acl->has()):

if (!$acl->has($request->module . '_' . $request->controller)) {
    // action/resource does not exist in ACL
    $request->setModuleName('default');
    $request->setControllerName('error');
    $request->setActionName('notfound');
} else {
    // resource does exist, check ACL
    if (!$acl->isAllowed($role, $module . '_' . $controller, $action)) {
        $request->setControllerName('user');
        $request->setActionName('login');
    }
}
1 голос
/ 09 июня 2016

Я использую это в помощнике действий контроллера:

$dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();
$actionMethodName = $dispatcher->formatActionName($this->getRequest()->getActionName()
if (!dispatcher->isDispatchable($request) || !in_array($actionMethodName, get_class_methods($this->getActionController()))) {
     throw new Zend_Controller_Action_Exception('Page not found', 404); 
}

или не создавайте исключение, просто пропустите проверку acl и пусть плагин обработчика ошибок позаботится об этом.

Обратите внимание, что в этом случае вы не можете использовать имена действий, которые не соответствуют функциям в контроллере, или вам придется создать проверку для этого случая.

1 голос
/ 15 апреля 2013

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

$front = Zend_Controller_Front::getInstance();
if (!$front->getDispatcher()->isDispatchable($request)) {
    throw new Zend_Exception('Page not found', 404);
    return false;
}
1 голос
/ 18 июля 2011

Я регулярно сталкиваюсь с этой проблемой: я использую модель безопасности по умолчанию (все веб-приложения, которые я пишу) и начинаю настраивать ACL, отказывая всем.

Настройка вашего контроллера ошибок будет работать, но я неЯ думаю, что это подходящее место, чтобы справиться с этим.

Метод диспетчера isDispatchable () почти работает, но не проверяет действие.Это не звучит правильно, но имеет смысл, если учесть, что вы, вероятно, хотите, чтобы ваш плагин acl работал со стандартными настройками роутера (модуль, контроллер, действие).

Я копаю глубже, чтобы увидетьесли есть элегантный способ сделать это, но сейчас я прекратил отказывать всем и явно отказывал в доступе на уровне модуля / контроллера / действия.

...