Zend Framework 2 - ZFCUser - Как исключить целевую страницу из аутентификации

Я использую ZF2 в комбинации с ZFCUser а также bjyauthorize, У меня есть целевая страница, которая должна быть общедоступной. Все остальные страницы должны быть за логином.

Сначала я обвинил bjyauthorize за то, что не позволил гостевым пользователям получить доступ к моей целевой странице. Но после некоторых дискуссий кажется, что ZFCUser блокирует путь.

Мой вопрос: как я могу сказать ZFCUser не блокировать одну страницу / действие?

Редактировать:

мой Application/Module.php выглядит как в этом посте. Когда я добавляю свое приложение myApp в белый список, я могу получить доступ к своей целевой странице, но все другие действия с myApp также.

Любые идеи, как изменить условие, что я могу соответствовать URL-адрес или просто добавить в список моих действий фронтэнда?

Может быть, я мог бы добавить второй маршрут к моей целевой странице. Но это не чистое решение, верно?

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, Я просто использую охрану маршрута, чтобы указать уровень роли, необходимый для конкретного маршрута.

Может быть, кто-то еще мог бы уточнить это?

Другие вопросы по тегам