web-dev-qa-db-ja.com

Zend Framework 2-ZFCUserによる認証のグローバルチェック

ZFCUserを正常にインストールしました。ここで、認証をグローバルにチェックする方法があるかどうか疑問に思います。

概説したように wiki内 認証をチェックする方法はいくつかあります。それらはすべて機能しますが、check-if-clauseを本当にすべての単一アクションに入れる必要がありますか?私のすべてのサイトは、ログインしているときにのみアクセスできる必要があります。アクセスできない場合は、ログインページに再ルーティングする必要があります。

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

13
Ron

正直なところ、認証されていないユーザーのページをブロックするのは良い考えではないと思いますすべて。ログインページにどのようにアクセスしますか?

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

たとえば、アプリケーションなどのモジュールの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);
    }
}
26
Jurian Sluiman

人、

ヒント、RouteMatchステートメントを修正するために「use」を追加することを忘れないでください。

use Zend\Mvc\Router\Http\RouteMatch;

ここにこれが必要です:

if (!$match instanceof RouteMatch)...

忘れた場合、上記の場合は一定していません

0
Giuseppe Lopes

ZF2モジュール BjyAuthorize を使用して、controller guardroute guardなどを使用して、guestuserなどのユーザーロールに基づいてページへのアクセスをブロック/許可できます。

0
Ankit Sharma

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
rafaelphp