5

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 で呼び出されます。 271 行目の /zend-eventmanager/src/EventManager.php および 135 行目の /xxxxxxxx/vendor/zendframework/zend-mvc/src/View/Http/RouteNotFoundStrategy.php で定義されています。

どこが間違っているのか、このイベントをどのようにトリガー/キャッチする必要がありますか?

4

3 に答える 3

3

ZF3 を使用しているため、ACL ロジックをブートストラップからミドルウェアに移動することをお勧めします。ACL が要求に問題がないことを示している場合は、最終的にコントローラーに到達する $next を呼び出します。そうでない場合は、応答のステータスを 403 に設定し、応答を返します。zend-mvc のドックをチェックしてください。まさにこの問題のクックブックの例があります。

https://docs.zendframework.com/zend-mvc/cookbook/middleware-in-listeners/

于 2016-09-15T17:17:31.480 に答える