2013-01-03 47 views
13

我成功安裝了ZFCUser。現在我想知道是否有辦法通過全球檢查身份驗證。Zend Framework 2 - 使用ZFCUser進行身份驗證的全局檢查

如概述in the wiki有幾種方法來檢查身份驗證。他們都工作,但我必須把檢查,如果條款真的在每一個行動?所有我的網站只有在登錄時纔可訪問,如果沒有,您應該重新路由到登錄頁面。

是否有人知道是否有一箇中心位置,我可以把這個邏輯?

回答

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

嗯,不知道......我寫了這一點,我的頭,所以儘量使PHP錯誤和將錯誤級別設置爲-1(意思是所有錯誤),看看這裏出現了什麼問題。也許無法找到路由器,但據我所知,路由器在路由事件內部的回調函數中,來自'onBootstrap'的'$ e'和'$ e'的**。如果沒有,嘗試從'onBoostrap()'方法中的'$ e'抓住路由器,並像'$ list'和'$ auth'那樣導入它。 –

+0

您需要將'new Response'更改爲'$ e-> getResponse()',那麼它完美地工作! – Ron

+0

感謝您的工作。我相應地更新了我的答案以供將來參考:) –

-3

另一種選擇可能是創建自己的抽象控制器超和實施這樣的onDispatch()方法:

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

    return parent::onDispatch($e); 
} 

您也可以在那裏實施白名單:)。

+1

我可能是錯的,但我認爲你所說的方法叫做'onDispatch'; – Tamlyn

+0

@Tamlyn:當然你是對的,謝謝! –

+0

什麼是白名單? –

0

在ZF 2.4.2我這樣做是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

您可以使用ZF2模塊BjyAuthorize基於用戶角色來阻止/允許訪問的網頁,如guestuser等使用controller guardroute guard

0

人,

提示,不要忘了添加 「使用」 糾正RouteMatch聲明:

use Zend\Mvc\Router\Http\RouteMatch; 

這裏需要這樣的:

if (!$match instanceof RouteMatch)... 

如果你忘了,如果上面有見異思遷

相關問題