2013-01-03 8 views
13

ZFCUserが正常にインストールされました。今私はグローバルに認証を確認する方法があるのだろうかと思います。Zend Framework 2 - ZFCUserによる認証のグローバルチェック

説明したように、in the wikiには、認証を確認するいくつかの方法があります。彼らはすべて動作しますが、実際にはアクションでにcheck-if-clauseを入れなければなりませんか?すべての私のサイトは、ログインするときにのみアクセス可能でなければなりません。そうでなければ、ログインページに再ルーティングする必要があります。

私はこの論理を置くことができる中心的な場所があるかどうか誰かが知っていますか?

答えて

25

正直言って、認証されていないユーザーに対してのすべてのページをブロックすることはお勧めしません。どのようにログインページにアクセスしますか?

つまり、匿名の訪問者がページのホワイトリストにアクセスできるようにするには、アクセスしているページを知っている必要があります。まず、ログインページを含めることをお勧めします。そのルートを使ってページを最も簡単にチェックすることができます。したがって、現在の一致したルートをホワイトリストと照らし合わせて確認してください。ブロックされた場合は、行動してください。それ以外の場合は何もしないでください。

の例では、例えば、アプリケーション、モジュールからModule.phpの内側に次のようになります。

namespace Application; 

use Zend\Mvc\MvcEvent; 
use Zend\Mvc\Router\RouteMatch; 

class Module 
{ 
    protected $whitelist = array('zfcuser/login'); 

    public function onBootstrap($e) 
    { 
     $app = $e->getApplication(); 
     $em = $app->getEventManager(); 
     $sm = $app->getServiceManager(); 

     $list = $this->whitelist; 
     $auth = $sm->get('zfcuser_auth_service'); 

     $em->attach(MvcEvent::EVENT_ROUTE, function($e) use ($list, $auth) { 
      $match = $e->getRouteMatch(); 

      // No route match, this is a 404 
      if (!$match instanceof RouteMatch) { 
       return; 
      } 

      // Route is whitelisted 
      $name = $match->getMatchedRouteName(); 
      if (in_array($name, $list)) { 
       return; 
      } 

      // User is authenticated 
      if ($auth->hasIdentity()) { 
       return; 
      } 

      // Redirect to the user login page, as an example 
      $router = $e->getRouter(); 
      $url  = $router->assemble(array(), array(
       'name' => 'zfcuser/login' 
      )); 

      $response = $e->getResponse(); 
      $response->getHeaders()->addHeaderLine('Location', $url); 
      $response->setStatusCode(302); 

      return $response; 
     }, -100); 
    } 
} 
+0

うーん、ないように注意してくださいを持って、

if (!$match instanceof RouteMatch)... 

を...私は私の頭の外にこれを書いたので、PHPのエラーを有効にしようとエラーレベルを-1(すべてのエラーを意味する)に設定し、ここで何が問題になっているかを確認してください。ルータは見つからないかもしれませんが、ルータがルートイベント内のコールバックから '$ e'の' onBootstrap' **や '$ e'の' $ e'の中にあることはわかっています。そうでなければ、 'onBoostrap()'メソッドの '$ e'からルータを把握し、' $ list'と '$ auth'のようにインポートしてみてください。 –

+0

'新しいレスポンス'を '$ e-> getResponse()'に変更する必要があります。 – Ron

+0

ありがとうございました。私は将来の参照のために私の答えを更新しました:) –

-3

別のオプションは、独自の抽象コントローラー・スーパークラスを作成し、このようなonDispatch()メソッドを実装するかもしれません。

public function onDispatch(MvcEvent $e) 
{ 
    // check authentication here 

    return parent::onDispatch($e); 
} 

あなたもホワイトリストを実装することができます。 controller guardroute guardを使用してZF 2.4.2で

+1

私は間違っているかもしれませんが、あなたが意味する方法は 'onDispatch'と呼ばれています。 – Tamlyn

+0

@Tamlyn:もちろん、あなたは正しいです、ありがとう! –

+0

ホワイトリストとは何ですか? –

0

私はあなたがそのようなguestなどのユーザの役割に基づいて、ページへのアクセスを許可/ブロックするためにZF2モジュールBjyAuthorizeを使用することができますModule.php

class module { 

protected $whitelist = array(
    'Application\Controller\Login' 
); 

public function onBootstrap(MvcEvent $e) 
{ 

    $eventManager  = $e->getApplication()->getEventManager(); 
    $moduleRouteListener = new ModuleRouteListener(); 
    $moduleRouteListener->attach($eventManager); 

    // add event 
    $eventManager->attach('dispatch', array($this, 'checkLogin')); 

} 

public function checkLogin($e) 
{ 

    $auth = $e->getApplication()->getServiceManager()->get("Zend\Authentication\AuthenticationService"); 
    $target = $e->getTarget(); 
    $match = $e->getRouteMatch(); 

    $controller = $match->getParam('controller'); 

    if(!in_array($controller, $this->whitelist)){ 
     if(!$auth->hasIdentity()){ 
      return $target->redirect()->toUrl('/login'); 
     } 
    } 

} 

//other methods.... 
} 
0

でこれを行う、userなどなど

0

人、

ヒントは、RouteMatch文を修正するために "使用" を追加し忘れてはいけない:

ここ
use Zend\Mvc\Router\Http\RouteMatch; 

は、この必要があります:あなたが忘れてしまった場合は上記の場合は不定

関連する問題