1

と をZF2併用しZFCUserていbjyauthorizeます。グローバルにアクセスできるランディング ページがあります。他のすべてのページはログインの背後にある必要があります。

最初は、ゲスト ユーザーがランディング ページにアクセスできないことを非難しました。 bjyauthorizeしかし、いくつかの議論の後、それZFCUserが道を塞いでいるようです.

私の質問は: ZFCUser に 1 つのページ/アクションをブロックしないように指示するにはどうすればよいですか?

編集:

この投稿Application/Module.phpように見えます。アプリをホワイトリストに追加すると、ランディング ページにアクセスできますが、他のすべてのアクションにもアクセスできます。myAppmyApp

URLに一致するか、フロントエンドアクションをホワイトリストに登録できるという条件を変更する方法はありますか?

たぶん、ランディング ページに 2 つ目のルートを追加できます。しかし、それはきれいな解決策ではありませんよね?

4

1 に答える 1

1

onBoostrap メソッドで認証を確認することを主張する場合は、次のようにすることができます。

class Module
{
    protected $whitelist = array(
        'zfcuser/login' => array('login'),
        'your-landing-route' => array('your-landing-action'),
    );

    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 and action is whitelisted
            $routeName = $match->getMatchedRouteName();
            $action = $match->getParam("action");

            if(array_key_exists($routeName,$list) && in_array($action,$list[$routeName])) {
                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);
    }
}

コードを少し変更しただけなので、ホワイト リストには特定のアクションも含まれています。次に、アクション パラメータをチェックして、ホワイト リスティングでもう少し具体的にすることができます。

これが最善の方法かどうかはわかりませんが、できる方法を示しているだけです。

BjyAuthorizeリソースチェックを使用できるので、使用時に認証をチェックする必要さえないと思います。ユーザーがゲスト ロール以外の役割を持っている場合、そのユーザーは実際のユーザーであり、認証されます。繰り返しますが、私はそれについて 100% ではありませんがZfcUserBjyAuthorize. ルート ガードを使用して、特定のルートに必要な役割レベルを指定するだけです。

多分他の誰かがこれを明確にすることができますか?

于 2013-04-09T08:56:41.043 に答える