13

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

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

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

4

5 に答える 5

26

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

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

たとえば、アプリケーションなどのモジュールの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);
    }
}
于 2013-01-03T11:35:48.720 に答える
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....
}
于 2015-05-25T19:33:30.173 に答える
0

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

于 2015-06-23T12:21:51.477 に答える
0

人々、

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

use Zend\Mvc\Router\Http\RouteMatch;

ここにこれが必要です:

if (!$match instanceof RouteMatch)...

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

于 2015-10-19T11:15:01.587 に答える
-3

別のオプションは、独自の抽象コントローラースーパークラスを作成し、次のようにonDispatch()メソッドを実装することです。

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

    return parent::onDispatch($e);
}

そこにもホワイトリストを実装できます:)。

于 2013-01-07T15:21:45.367 に答える