ZF2 редирект, если ACL не разрешает доступ к странице
У меня есть модуль, который создает мое дерево ACL, которое работает нормально.
У меня также есть файл конфигурации навигации в каталоге config / autoload, в котором подробно описана структура моего приложения, а также ресурсы, связанные с записями. У меня также есть фабрика навигации в моей конфигурации модуля приложения.
Все это работает нормально, и я отображаю свое меню, основываясь на разрешениях для роли вошедшего в систему пользователя и ресурсов для страницы в конфигурации навигации.
Что я не могу понять, так это как запретить доступ к страницам, к которым у пользователя нет доступа (те, которые скрыты в визуализированном меню навигации). Я хотел бы, чтобы это управлялось в модуле.
Я предполагаю, что в моем файле Module.php, в функции onBootstrap, мне нужно будет запустить isAllowed для ACL и перенаправить (как в этом вопросе - Переслать другому контроллеру / действию из module.php). Похоже, что isAllowed требует ресурс для запроса. Это должно быть получено из конфигурации навигации.
Я могу заставить это работать, если я жестко закодирую ресурс, требуемый в функции isAllowed. По сути, мне просто нужно получить ресурс запроса текущей страницы из конфигурации навигации.
Я уверен, что это стандартная функциональность, но я не могу найти конкретных примеров.
Любая помощь приветствуется.
Крис
2 ответа
Это то, что вы ищете, или вы ищете, как получить доступ к вашей конфигурации из метода onBootstrap?
public function onBootstrap($event) {
$matched_route = $event->getRouteMatch()->getMatchedRouteName();
$someOtherClass = new MyClassThatAuthenticatesRoutes();
if(!($someOtherClass->isAllowed($matched_route)){
$response = $event->getResponse();
$response->setStatusCode(401);
$response->setReasonPhrase('Not allowed!');
return $response;
}
Если вы ищете только конфигурацию, вы можете перейти:
$sm = $e->getApplication()->getServiceManager();
$config = $sm->get('config');
Если вам нужно сопоставить маршруты для ACL, посмотрите что-то вроде:
/**
* Retrieve the route match
*
* @return string
*/
protected function getMatchRoute()
{
$router = $this->getServiceLocator()->get('router');
$request = $this->getServiceLocator()->get('request');
$this->routeMatch = $router->match($request)->getMatchedRouteName();
return $this->routeMatch;
}
Тогда в вашем контроллере:
// note, $acl is just a class I wrote to extend class Zend\Permissions\Acl\Acl
// because I needed additional functionality
$acl = new \PATH_TO\Acl\Acl();
// checkAcl(), just however you plan on handling permissions
// $role is obviously just that, the role of the user, where ever
// you are setting that.
// the second param is from the method in the above code block which is the
// resource (page) you are wanting to check against
$access = $acl->checkAcl($role, $this->getMatchRoute());
// they don't have access so redirect them
if (!$access)
{
return $this->redirect()->toRoute('your_route', array());
}
Если вам нужно больше увидеть код, просто дайте мне знать, но, надеюсь, это поможет вам начать.