Zend框架2 - 与ZFCUser认证的全局检查(Zend Framework 2 - Glob

2019-07-17 18:51发布

我安装ZFCUser成功。 现在,我不知道是否有在全球范围内检查认证的方式。

正如概述在维基有几种方法来检查AUTH。 他们都工作,但我必须把退房如果从句真的每一个动作? 在beeing记录,如果没有,你应该重新路由到登录页面时,我所有的网站应该只有accessable。

有谁知道,如果有一个集中的地方,我可以把这个逻辑是什么?

Answer 1:

说实话,我不认为这是阻止每一个页面的未验证用户是个好主意。 你将如何访问登录页面?

这就是说,你必须知道要访问的页面,取消对匿名用户访问页面的白名单。 首先,我建议,包括登录页面。 您可以通过使用他们的路线最简单的检查页面。 因此,检查对白名单目前与之匹配的路由。 如果受阻,作用于。 否则,什么都不做。

一个例子是一个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);
    }
}


Answer 2:

在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....
}


Answer 3:

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



Answer 4:

人,

提示,不要忘了添加“用”来纠正RouteMatch声明:

use Zend\Mvc\Router\Http\RouteMatch;

这里需要这样的:

if (!$match instanceof RouteMatch)...

如果你忘了,如果上面有见异思迁



Answer 5:

另一种选择可能是创建自己的抽象控制器超和实施这样的onDispatch()方法:

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

    return parent::onDispatch($e);
}

您可以在那里实现白名单太:)。



文章来源: Zend Framework 2 - Global check for authentication with ZFCUser