2009-07-22 3 views
0

Я только что создал плагин, чтобы перейти с моего сайта, чтобы убедиться, что пользователь аутентифицирован перед выполнением действия. Это плагин: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 был отключен просмотр рендеринга и макет. Я пробовал общаться с ним и не могу найти надежный способ убедиться, что перенаправление в плагине всегда отображается, и показывает себя. Любая помощь будет выдающейся.

ответ

0

Я хотел бы добавить в isAllowed() часть плагина это:

if(!$acl->isAllowed($role, $resource, $privilege)) 
{ 
    if(!$this->getRequest()->isXMLHttpRequest()) 
    { 
     //@todo getResponse 
     $response->setBody(Zend_Json::encode(array('result'=>'fail', 'reason'=>'Need login'); 
     $response->sendResponse(); 
     exit; 
    } 

    Booze_Log::log("ACLPlugin: Sent to login"); 

    $request->setControllerName('login'); 
    $request->setActionName('index'); 
    $request->setDispatched(false); 
} 

чем на вашей странице асинхронной ручки incloming JSON, когда результат «не сдала».

+0

Конечно, это не должно быть! в isxmlhttprequest;) –

+0

Эй, мне нравится ваша идея. Поскольку плагин вводится в preDispatch, где я могу поместить тест «fail» в контроллер Async? Если я поставлю его непосредственно в preDispatch в контроллере, там будет работать тест? Есть ли другая функция, которую я мог бы использовать? – Ethan

+0

Нет, тест должен быть в теле страницы :) Я предполагаю, что вы используете AJAX для асинхронного запроса, не так ли? –

0

Вы пытались сделать заголовок() перенаправлением? как:

$this->_helper->getHelper('Redirector')->setCode(303) 
             ->setExit(false) 
             ->setGotoSimple('index', 'login'); 

Edit: Как вы Сайда в своем комментарии, вы получите правильный HTML (логин) - не могли бы вы проверить в действии входа, если запрос асинхронный и вернуть код ошибки, вы тогда обрабатываете в своем коде запроса javascript?

+0

Эй, я не знаю, как получить помощников в плагинах. Когда я пробовал, он не работал, потому что $, похоже, относится к плагину, а не к контроллеру, на котором он принят. – Ethan

+0

@Ethan: '$ redirector = Zend_Controller_Action_HelperBroker :: getStaticHelper ('Redirector');' – jason

+0

Он по-прежнему делает то же самое. Я уверен, что это потому, что он выполняет «Get» на данных и просто получает html, а не направляет его. – Ethan

 Смежные вопросы

  • Нет связанных вопросов^_^