1

我正在与andZF2结合使用。我有一个应该可以全局访问的登录页面。所有其他页面都需要登录。ZFCUserbjyauthorize

起初,我责怪 bjyauthorize不让来宾用户访问我的登录页面。但经过一些讨论后,这似乎ZFCUser阻碍了前进的方向。

我的问题是:如何告诉 ZFCUser 不要阻止一个页面/操作?

编辑:

我在这篇文章Application/Module.php中的样子。当我将我的应用程序添加到白名单时,我可以访问我的登录页面,但也可以访问所有其他操作。myAppmyApp

任何想法如何改变我可以匹配 URL 或只是将我的前端操作列入白名单的条件?

也许我可以在我的登陆页面添加第二条路线。但这不是一个干净的解决方案,对吧?

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% 的,但我知道我没有ZfcUser在我的应用程序中使用身份验证检查,它使用BjyAuthorize. 我只是使用路由守卫来指定特定路由所需的角色级别。

也许其他人可以澄清这一点?

于 2013-04-09T08:56:41.043 回答