用于检查“授权”标头的Zend Framework 1.12插件

时间:2013-08-05 15:48:24

标签: rest zend-framework

我正在使用Zend Framework 1.12编写REST api。我想在控制器插件中检查“Authorization”标题。

我将代码放在插件的preDispatch操作中

$authorizationHeader    =   $request->getHeader('Authorization');
if(empty($authorizationHeader)) {
    $this->getResponse()->setHttpResponseCode(400);
    $this->getResponse()->setBody('Hello');
    die(); //It doesn't work
}

问题在于控制器的操作仍然被调用。我试过'die()','退出'。我的问题是如何从插件返回响应,而不是调用控制器的动作。

2 个答案:

答案 0 :(得分:1)

几周前,Zend使用这种方法做了类似的REST API:

Class Vars / Consts:

protected $_hasError = false;
const HEADER_APIKEY = 'Authorization';

我的preDispatch:

public function preDispatch()
{
    $this->_apiKey = ($this->getRequest()->getHeader(self::HEADER_APIKEY) ? $this->getRequest()->getHeader(self::HEADER_APIKEY) : null);

    if (empty($this->_apiKey)) {
        return $this->setError(sprintf('Authentication required!'), 401);
    }

    [...]

}

我的自定义setError函数:

private function setError($msg, $code) {
    $this->getResponse()->setHttpResponseCode($code);
    $this->view->error = array('code' => $code, 'message' => $msg);
    $this->_hasError = true;

    return false;
}

然后只需检查您的功能中是否设置了错误:

public function yourAction()
{
    if(!$this->_hasError) {

    //do stuff

    }
}

如果您正在使用contextSwitch和JSON,则会自动返回包含错误的数组&如果出现错误,则显示:

public function init()
{
    $contextSwitch = $this->_helper->getHelper('contextSwitch');
    $this->_helper->contextSwitch()->initContext('json');

    [...]

}

希望这有帮助

答案 1 :(得分:1)

由于检查标头通常是低级请求操作,因此您可以执行标头验证,如果在插件的dispatchLoopStartup中无效则抛出异常。然后在错误控制器中,返回相应的响应。这将阻止调度/运行操作,并且可以应用于任何控制器/操作而无需修改任何控制器代码。

Controller插件:

class AuthHeader extends Zend_Controller_Plugin_Abstract
{
    public function dispatchLoopStartup(\Zend_Controller_Request_Abstract $request)
    {
        // Validate the header.
        $authorizationHeader = $request->getHeader('Authorization');

        if ($invalid) {
            throw new Zend_Exception($error_message, $error_code);
        }
    }
}

错误处理程序:

class ErrorController extends Zend_Controller_Action
{
    public function init()
    {
        // Enable JSON output for API originating errors.
        if ($this->isApiRequest($this->getRequest())) {
            $contextSwitch = $this->_helper->getHelper('contextSwitch');
            $contextSwitch->addActionContext('error', 'json')
                          ->setAutoJsonSerialization(true)
                          ->initContext('json');
        }
    }

    public function errorAction()
    {
        // Handle authorization header errors
        // ...

        // Handle errors
        // ...
    }

    public function isApiRequest($request)
    {
        // Determine if request is an API request.
        // ...
    }
}