Я только что создал плагин, чтобы перейти с моего сайта, чтобы убедиться, что пользователь аутентифицирован перед выполнением действия. Это плагин:Async вмешивается в мой плагин ACL
class Booze_Plugin_AclPlugin extends Zend_Controller_Plugin_Abstract{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$auth = Booze_Permissions_Auth::getInstance();
$acl = Zend_Registry::get('acl');
if(!$auth->hasIdentity())
{
$role = Booze_Permissions_Roles::GUEST;
}
else
{
$role = $auth->getUser()->role;
}
$resource = $request->getControllerName();
$privilege = $request->getActionName();
if(!$acl->isAllowed($role, $resource, $privilege))
{
Booze_Log::log("ACLPlugin: Sent to login");
$request->setControllerName('login');
$request->setActionName('index');
$request->setDispatched(false);
}
}
}
Это, кажется, работает для страниц, которые не являются асинхронными. Тем не менее, у меня есть контроллер, который должен выполнять асинхронные функции. Это то, что контроллер (соответствующие части):
class AsyncController extends Zend_Controller_Action{
public function init()
{
if(!$this->getRequest()->isXMLHttpRequest())
{
$this->_forward('index', 'index');
}
$this->_helper->viewRenderer->setNoRender();
$this->_helper->getHelper('layout')->disableLayout();
}
public function addcommentAction()
{
$params = $this->getDecoded('comment', true);
$params_array = (array)$params;
$auth = Booze_Permissions_Auth::getInstance();
if(!$auth->hasIdentity())
{
$this->getResponse()->setBody("Guest");
}
$params_array['user_id'] = $auth->getUser('user_id');
$params_array['store_id'] = Booze_Storage::get('store_id');
if($this->comments->insertComment($params_array))
{
$this->getResponse()->setBody("success");
}
else
{
$this->getResponse()->setBody("CommentFail");
}
}
Когда я вызываю функцию асинхронной addcommentAction, даже если подписанный в качестве гостя, он не принимает меня к контроллеру входа. Однако я обнаружил из firebug, что он отправляет html для контроллера входа, но просто не отображается в моем браузере. На мой взгляд, это должно иметь какое-то отношение к тому факту, что в контроллере async в init был отключен просмотр рендеринга и макет. Я пробовал общаться с ним и не могу найти надежный способ убедиться, что перенаправление в плагине всегда отображается, и показывает себя. Любая помощь будет выдающейся.
Конечно, это не должно быть! в isxmlhttprequest;) –
Эй, мне нравится ваша идея. Поскольку плагин вводится в preDispatch, где я могу поместить тест «fail» в контроллер Async? Если я поставлю его непосредственно в preDispatch в контроллере, там будет работать тест? Есть ли другая функция, которую я мог бы использовать? – Ethan
Нет, тест должен быть в теле страницы :) Я предполагаю, что вы используете AJAX для асинхронного запроса, не так ли? –