2016-09-08 5 views
4

ACLを持つ新しいZF3アプリケーションがあります。今私は、不正なアクセスの場合、エラーページ(例えば403)にリダイレクトする必要があります。ACLの承認が失敗した後のZF3のリダイレクト

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 ; 
    } 
} 

しかし、私:すべてはModule.php(抽出物)で、私のユーザーモジュールである

...私は最善の方法は、それをキャッチし、イベントを発生することがあると思いますが、私は失敗しましたイベントがトリガされ、私のdispatchError()メソッドは呼び出すことはありません、とZF3の叫び:私は間違っているとどのように私は、このイベントをキャッチ/トリガすべき

Catchable fatal error: Argument 1 passed to Zend\Mvc\View\Http\RouteNotFoundStrategy::detectNotFoundError() must be an instance of Zend\Mvc\MvcEvent, instance of Zend\EventManager\Event given, called in /xxxxxxx/vendor/zendframework/zend-eventmanager/src/EventManager.php on line 271 and defined in /xxxxxxxx/vendor/zendframework/zend-mvc/src/View/Http/RouteNotFoundStrategy.php on line 135

答えて

3

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

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

+0

この回答は私の質問に完全には答えていないようですが、開発者を改善する指標を与えてくれるので、私は賞金を授与します... Tks –

0

、これは私が私のcheckProtectedRoutes()方法で直接応答を返す、問題を解決し方法です:私は同じを持っている

// Erreur 403 
$e->stopPropagation(); 

$baseModel = new ViewModel(); 
$baseModel->setTemplate('403'); 

$resolver = new TemplateMapResolver(); 
$resolver->setMap(['403' => __DIR__ . '/../view/error/403.phtml']); 

// Render view 
$renderer = new PhpRenderer(); 
$renderer->setResolver($resolver); 
$content = $renderer->render($baseModel); 
$response = $e->getResponse(); 
$response->setStatusCode(403); 
$response->getHeaders()->addHeaderLine('Location', $e->getRequest()->getBaseUrl() . '/login'); 
$response->setContent($content); 
return $response ; 
0

問題。 ファンクションcheckProtectedRoutes(MvcEvent $e)のエラートリガは、triggerEventメソッドを使用する必要があります。

関連する問題