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());
}

Если вам нужно больше увидеть код, просто дайте мне знать, но, надеюсь, это поможет вам начать.

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