我有一个带有 ACL 的新 ZF3 应用程序。现在,我需要在未经授权的访问的情况下重定向到错误页面(例如 403)。我认为最好的方法是触发一个事件,然后捕获它,但我失败了......
全部都在我的用户模块中Module.php
(摘录):
namespace User;
use Zend\Mvc\MvcEvent;
use Zend\Permissions\Acl\Acl;
use Zend\Stdlib\Response ;
use Zend\View\Model\ViewModel;
[...]
class Module implements ConfigProviderInterface
{
[...]
public function onBootstrap(MvcEvent $e)
{
// Set event to check ACL, then to handle unauthorized access
$eventManager = $e->getApplication()->getEventManager();
$eventManager->attach(MvcEvent::EVENT_ROUTE, array($this, 'checkProtectedRoutes'), 1);
$eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, array($this, 'dispatchError'), -999);
// Init ACL
$this->initAcl($e);
}
public function initAcl(MvcEvent $e)
{
[...]
}
public function checkProtectedRoutes(MvcEvent $e)
{
// My access logic working fine. return if OK
[...]
// if authorization failed
$e->setError('ACL_ACCESS_DENIED') ;
$e->setParam('route', $route);
$e->getTarget()->getEventManager()->trigger(MvcEvent::EVENT_DISPATCH_ERROR, $e);
}
public function dispatchError(MvcEvent $e)
{
// Check error type
$error = $e->getError();
switch ($error) {
case 'ACL_ACCESS_DENIED' :
// What should I do here ?
break;
default:
return ;
break;
}
return false ;
}
}
但是当我的事件被触发时,我的dispatchError()
方法永远不会被调用,ZF3 哭了:
可捕获的致命错误:传递给 Zend\Mvc\View\Http\RouteNotFoundStrategy::detectNotFoundError() 的参数 1 必须是 Zend\Mvc\MvcEvent 的实例,给定的 Zend\EventManager\Event 实例,在 /xxxxxxx/vendor/zendframework 中调用/zend-eventmanager/src/EventManager.php 第 271 行,并在 /xxxxxxxx/vendor/zendframework/zend-mvc/src/View/Http/RouteNotFoundStrategy.php 第 135 行定义
我哪里错了,我应该如何触发/捕获这个事件?
由于您使用的是 ZF3,我可能建议将您的 ACL 逻辑从引导程序移至中间件中。如果 ACL 表明请求可以,您将调用 $next,它最终会到达控制器。如果不是,请将响应的状态设置为 403 并返回响应。查看 zend-mvc 上的扩展坞,因为他们有一个针对这个问题的食谱示例。
https://docs.zendframework.com/zend-mvc/cookbook/middleware-in-listeners/ https://docs.zendframework.com/zend-mvc/cookbook/middleware-in-listeners/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)