Php 异步干扰我的ACL插件

Php 异步干扰我的ACL插件,php,zend-framework,plugins,acl,Php,Zend Framework,Plugins,Acl,我刚刚创建了一个插件,用于我的站点,以确保用户在执行操作之前经过身份验证。这是插件: class Booze_Plugin_AclPlugin extends Zend_Controller_Plugin_Abstract{ public function preDispatch(Zend_Controller_Request_Abstract $request) { $auth = Booze_Permissions_Auth::getInstance(); $acl = Z

我刚刚创建了一个插件,用于我的站点,以确保用户在执行操作之前经过身份验证。这是插件:

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,但只是没有显示在我的浏览器中。在我看来,这一定与异步控制器在init中关闭了视图渲染和布局这一事实有关。我试过搞乱它,但找不到可靠的方法来确保插件中的重定向始终呈现并显示出来。任何帮助都将非常重要。

您是否尝试过进行标题重定向? 比如:


编辑:正如您在评论中所说的,您确实获得了正确的html登录-如果请求是异步的,您不能签入登录操作并返回一些错误代码,然后在javascript请求代码中处理这些错误代码吗?

我将添加到!我允许此插件的一部分:

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);
}

而不是在结果为“fail”时包含JSON的异步页面句柄上

当然不应该是‘!’在isxmlhttprequest中;嘿,我喜欢你的主意。由于该插件是在preDispatch发布的,我可以在哪里对异步控制器进行失败测试?如果我把它直接放在控制器的预喷器中,测试会在那里工作吗?我还可以使用其他函数吗?不,测试应该在page的正文中:我假设您使用AJAX处理异步请求,不是吗?听起来不错。它不是自动的,我仍然喜欢,但是有点灵活,所以谢谢!嘿,我不知道如何在插件中找到助手。当我尝试时,它没有起作用,因为$this似乎指的是插件,而不是它所使用的控制器。@Ethan:$redirector=Zend_controller_Action_HelperBroker::getStaticHelper'redirector';它仍然在做同样的事情。我很确定这是因为它正在对数据执行Get,只是获取html,而不是指向它。
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);
}