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