Перенаправление запросов формирует универсальный контроллер в Zend Application без зацикливания навсегда
Есть много связанных постов с тем, что я спрашиваю, но после долгих поисков не смог найти то, что искал, мои извинения, если оно где-то существует.
Моя цель - ВСЕ запросы к моему Zend App должны проходить через плагин preDispatch, а затем передаваться на собственный контроллер Auth, который решит, достаточно ли существующих учетных данных для запрашиваемой операции. "Достаточность" зависит от логики приложения, поэтому я хочу сделать это на уровне "контроллер + модель". Если их достаточно, они отправляют исходный запрос вместе с указанным действием "контроллер +", если нет, по умолчанию используется действие "потеряться".
В настоящее время я использую пользовательский плагин auth, установленный в preDispatch, чтобы просто проверить учетные данные авторизации POST (если мы входим в систему), тогда во всех случаях плагин сохраняет исходный запрос и перенаправляет всех (авторизованных или нет).) к моему контроллеру аутентификации, а-ля:
$request->setModuleName('default')
->setControllerName('auth')
->setActionName('check')
->setParam('oreq',$request->getParams());
Моя проблема / вопрос заключается в том, что в рамках моего действия auth->check как мне выполнить перенаправление после принятия решения? Если я использую:
$this->_helper->redirector($or['action'], $oreq['controller']);
тогда я, очевидно, получаю бесконечный цикл, когда эти запросы снова проходят через плагин preDispatch. Конечно, я мог передать что-то с перенаправлением, чтобы плагин Auth игнорировал такие запросы, но это явно дыра в безопасности. Я думал о создании и сохранении хеша md5, сохранении его в сеансе и передаче его в качестве escape-параметра, но это кажется немного отрывочным.
Есть идеи получше? Возможно, метод перенаправления, который не проходит стандартную процедуру предварительной отправки в Zend App? Заранее спасибо!
1 ответ
Обычно это не так в Zend Framework. Не все запросы отправляются в общее место и перенаправляются в исходное запрошенное место аутентификации.
Для контроля доступа используйте Zend_Acl. Благодаря этому вы можете легко определить, есть ли у текущего пользователя необходимая авторизация для доступа к контенту, иначе перенаправить на действие "потеряться".
Если вы все еще непреклонны в использовании своей техники, используйте метод _forward вместо метода перенаправления.
поскольку _forward
является внутренним перенаправлением, вы можете передать дополнительные аргументы и проверить это в preDispath, чтобы избежать цикла.
$this->_forward($action, $controller, $module, $params)