Передать пользовательские переменные в конфигурации маршрутизации ZF2?

Я думаю о лучшем способе реализации ACL. Итак — мне нужно защищать определенные маршруты. Некоторые маршруты будут доступны только для пользователей, некоторые для гостей, а некоторые для администраторов.

Похоже, что лучший способ сделать это, добавив $ роль переменная в конфиге маршрутизации. Затем я присоединяюсь к событию после маршрута, извлекаю routeMatch и вижу, может ли этот пользователь войти в этот маршрут.

Как я могу это сделать? Могу ли я просто ввести дополнительные переменные, как это:

'router' => array(
'routes' => array(
'route1' => array(
'type' => 'Zend\Mvc\Router\Http\Regex',
'options' => array(
'regex' => '/some/route/1',
'defaults' => array(
'controller' => 'Subscriber\Controller\View',
'action'     => 'route1',
'role'       => 'user', //extra
),
'spec' => '/some/route/1',
),
),
'route2' => array(
'type' => 'Zend\Mvc\Router\Http\Regex',
'options' => array(
'regex' => '/some/route/2',
'defaults' => array(
'controller' => 'Subscriber\Controller\View',
'action'     => 'route2',
'role'       => 'guest', //extra
),
'spec' => '/some/route/2',
),
),
//other routes....
),
),

0

Решение

Да, вы можете просто добавить ключ маршрутизатора, как у вас есть

'defaults' => array(
'controller' => 'Subscriber\Controller\View',
'action'     => 'route1',
'role'       => 'user', //extra
),

И тогда вы можете проверить это так

public function onBootstrap(MvcEvent $e) {
$application            = $e->getApplication();
$eventManager = $application->getEventManager();
$eventManager->attach(MvcEvent::EVENT_ROUTE, function(MvcEvent $e) {
$e->getRouteMatch()->getParam('role');
});
}

Однако для этого есть модули
Например bjyoungblood / BjyAuthorize который работает с ZfcUser

1

Другие решения

Вы должны взглянуть на: ZfcRbac. Это хорошо задокументировано.

0