我成功安裝了ZFCUser
。現在我想知道是否有辦法通過全球檢查身份驗證。Zend Framework 2 - 使用ZFCUser進行身份驗證的全局檢查
如概述in the wiki有幾種方法來檢查身份驗證。他們都工作,但我必須把檢查,如果條款真的在每一個行動?所有我的網站只有在登錄時纔可訪問,如果沒有,您應該重新路由到登錄頁面。
是否有人知道是否有一箇中心位置,我可以把這個邏輯?
我成功安裝了ZFCUser
。現在我想知道是否有辦法通過全球檢查身份驗證。Zend Framework 2 - 使用ZFCUser進行身份驗證的全局檢查
如概述in the wiki有幾種方法來檢查身份驗證。他們都工作,但我必須把檢查,如果條款真的在每一個行動?所有我的網站只有在登錄時纔可訪問,如果沒有,您應該重新路由到登錄頁面。
是否有人知道是否有一箇中心位置,我可以把這個邏輯?
說實話,我不認爲這是一個好主意,阻止每頁爲未經過身份驗證的用戶。你將如何訪問登錄頁面?
也就是說,您必須知道正在訪問的網頁,才能爲匿名訪問者提供可訪問的網頁白名單。首先,我建議包括登錄頁面。您可以使用他們的路線檢查最簡單的頁面。因此,請檢查當前匹配的白名單路由。如果被阻止,就採取行動。否則,什麼都不要做。
一個例子是一個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);
}
}
另一種選擇可能是創建自己的抽象控制器超和實施這樣的onDispatch()方法:
public function onDispatch(MvcEvent $e)
{
// check authentication here
return parent::onDispatch($e);
}
您也可以在那裏實施白名單:)。
在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....
}
您可以使用ZF2模塊BjyAuthorize基於用戶角色來阻止/允許訪問的網頁,如guest
,user
等使用controller guard
,route guard
等
人,
提示,不要忘了添加 「使用」 糾正RouteMatch聲明:
use Zend\Mvc\Router\Http\RouteMatch;
這裏需要這樣的:
if (!$match instanceof RouteMatch)...
如果你忘了,如果上面有見異思遷
嗯,不知道......我寫了這一點,我的頭,所以儘量使PHP錯誤和將錯誤級別設置爲-1(意思是所有錯誤),看看這裏出現了什麼問題。也許無法找到路由器,但據我所知,路由器在路由事件內部的回調函數中,來自'onBootstrap'的'$ e'和'$ e'的**。如果沒有,嘗試從'onBoostrap()'方法中的'$ e'抓住路由器,並像'$ list'和'$ auth'那樣導入它。 –
您需要將'new Response'更改爲'$ e-> getResponse()',那麼它完美地工作! – Ron
感謝您的工作。我相應地更新了我的答案以供將來參考:) –