使用Dispatch Event检查授权

时间:2014-04-07 18:30:14

标签: zend-framework2

我正在尝试设置一个简单的API。我有一个控制器所有其他API控制器正在扩展,我已经附加了一个这样的调度监听器。我创建了一个永远失败的测试。将状态代码设置为401,然后返回消息。但是,它仍然调用主控制器方法而不是放弃preDispatch方法的请求。我可以在这里建立一个正确的响应并强制ZF2不继续执行请求的路由吗?我尝试添加exit()语句,但客户端收到的回复不完整。

protected function attachDefaultListeners()
    {
        parent::attachDefaultListeners();
        $events = $this->getEventManager();
        $this->events->attach('dispatch', array($this, 'preDispatch'), 100);
        $this->events->attach('dispatch', array($this, 'postDispatch'), -100);
    }

    public function preDispatch (MvcEvent $e)
    {
        $this->dm = $this->getServiceLocator()->get('doctrine.documentmanager.odm_default');
        // TODO: Check user and token from DB
        if (Cookie::isCookieSet())
        {
            $cookie = Cookie::readCookie();
            if (empty($cookie->user))
            {
                $this->getResponse()->setStatusCode(401);
                return new JsonModel(array('auth' => false, 'msg' => 'Try again'));
            }
        // Cookie not set, if we are authenticating, continue; otherwise return a failure
        } else {

        }

    }

1 个答案:

答案 0 :(得分:1)

您需要返回一个响应对象来使进程短路,而不是ViewModel:

尝试这样的事情:

$response = $this->getResponse();
$response->setStatusCode(401);
$response->setContent(array('auth' => false, 'msg' => 'Try again'));
return $response;