Zend框架1.12插件检查“授权”头(Zend Framework 1.12 plugin for

2019-10-18 11:35发布

我正在写使用Zend Framework 1.12 REST API。 我要检查在控制器插件“授权”头。

我把代码在插件的preDispatch行动

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

问题是,后控制器的动作仍在调用。 我想“死()”,“退出”。 我的问题是怎么回事,从插件的反应和不调用控制器的动作。

Answer 1:

做与Zend类似的REST API几个星期前使用这种方法:

类瓦尔/ 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,然后用你的错误阵列将自动返回和显示,如果有错误occours:

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

    [...]

}

希望这可以帮助



Answer 2:

由于检查头通常是一个低级别的请求操作,你可以做头部验证,然后抛出一个异常,如果没有有效的插件dispatchLoopStartup。 然后在您的差错控制,返回相应的反应。 这将阻止派出/运行的操作,没有修改任何控制器代码可以被应用到任何控制器/行动。

控制器插件:

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.
        // ...
    }
}


文章来源: Zend Framework 1.12 plugin for checking “Authorization” header