Zend Framework 2 - 使用ZFCUser进行全局检查

时间:2013-01-03 11:17:51

标签: php authentication zend-framework2 zfcuser

我成功安装了ZFCUser。现在我想知道是否有办法全局检查身份验证。

如概述in the wiki,有几种方法可以检查身份验证。它们都有效,但是我必须将check-if-clause真正放在每一个动作中吗?登录时我的所有网站都应该只能访问,如果没有,您应该被重新路由到登录页面。

有人知道我是否有一个可以放置这种逻辑的中心位置?

5 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分: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....
}

答案 2 :(得分:0)

您可以使用ZF2模块BjyAuthorize使用guestuser阻止/允许基于controller guardroute guard等用户角色访问网页等

答案 3 :(得分:0)

人,

提示,不要忘记添加“use”来更正RouteMatch语句:

use Zend\Mvc\Router\Http\RouteMatch;

这需要这个:

if (!$match instanceof RouteMatch)...

如果你忘了,上面的if有不定的

答案 4 :(得分:-3)

另一种选择可能是创建自己的抽象控制器超类并实现onDispatch()方法,如下所示:

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

    return parent::onDispatch($e);
}

您也可以在那里实施白名单:)。