Я думаю о лучшем способе реализации 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....
),
),
Да, вы можете просто добавить ключ маршрутизатора, как у вас есть
'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
Вы должны взглянуть на: ZfcRbac. Это хорошо задокументировано.