2011-12-22 5 views
1

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

Моя цель - ВСЕ запросы к моему Zend-приложению должны проходить через плагин preDispatch, а затем перейти к настраиваемому контроллеру Auth, который будет определять, достаточны ли существующие учетные данные для требуемой операции. «Достаточно» зависит от логики приложения, поэтому я хочу сделать это на уровне контроллера + модели. Если они достаточны, они отправляют исходный запрос вместе с указанным контроллером + действием, если они по умолчанию не выполнят действие «потеряться».

В настоящее время я использую собственный настраиваемый плагин auth в preDispatch, чтобы просто проверить аутентификационные данные POST'а (если мы входим в систему), тогда во всех случаях плагин хранит исходный запрос и перенаправляет всех (auth «d или нет) на мой контроллер AUTH, а-ля:

$request->setModuleName('default') 
      ->setControllerName('auth') 
      ->setActionName('check') 
      ->setParam('oreq',$request->getParams()); 

Моя проблема/вопрос заключается в том, что в моем auth-> проверка действия, как я должен выполнить перенаправление после принятия решения? Если я использую:

$this->_helper->redirector($or['action'], $oreq['controller']); 

, то я, очевидно, получить бесконечный цикл, так как эти запросы снова пройти через плагин preDispatch. Конечно, я могу передать что-то с перенаправлением, чтобы плагин Auth игнорировал такие запросы, но это явно дыра в безопасности. Я подумал о том, может ли генерировать и хранить хеш-память md5, сохраняя ее на сеансе и передавая ее как параметр escape, но это кажется немного отрывочным.

Какие-нибудь лучшие идеи? Возможно, метод перенаправления, который не проходит стандартную процедуру предварительной обработки в Zend App? Заранее спасибо!

ответ

0

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

Для контроля доступа используйте Zend_Acl. Благодаря этому вы можете легко определить, имеет ли текущий пользователь необходимый авторизат доступа к контенту, иначе перенаправление на «потерянное» действие.

Если вы по-прежнему непреклонны в использовании своей техники, используйте метод _forward вместо метода перенаправления.

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

$this->_forward($action, $controller, $module, $params) 
+1

Вы - звезда, большое спасибо. – Dan

+1

fyi, _forward делает поток через отправку – Dan