Zend Framework 2 - BjyAuthorize всегда запрещает доступ
Я настроил bjyoungblood/bjy-authorize
модуль, но в настоящее время я получаю 403
ошибка "доступ запрещен" для каждого URL-адреса, кроме того, который был настроен в home
маршрут.
мой module.byjauthorize.global.php
выглядит следующим образом:
'bjyauthorize' => array(
'guards' => array(
'BjyAuthorize\Guard\Controller' => array(
array('controller' => 'index', 'action' => 'index', 'roles' => array('guest','user')),
array('controller' => 'index', 'action' => 'stuff', 'roles' => array('user')),
array('controller' => 'zfcuser', 'roles' => array()),
//backend
array('controller' => 'Application\Controller\Index', 'roles' => array('admin')),
array('controller' => 'MyModule\MyEntity\MyEntity', 'roles' => array('admin')),
),
'BjyAuthorize\Guard\Route' => array(
array('route' => 'zfcuser', 'roles' => array('user')),
array('route' => 'zfcuser/logout', 'roles' => array('user')),
array('route' => 'zfcuser/login', 'roles' => array('guest')),
array('route' => 'zfcuser/register', 'roles' => array('guest')),
array('route' => 'home', 'roles' => array('admin')),
array('route' => 'my-entity', 'roles' => array('admin')),
),
),
),
Я пытался удалить BjyAuthorize\Guard\Route
часть, но без эффекта. Когда я удаляю home
маршрут, то домашняя страница также заблокирована. Таким образом, как контроллер, так и Route-Guard, похоже, работают. Как я могу отладить это поведение?
4 ответа
ПРИМЕЧАНИЕ: следующее действительно для BjyAuthorize 1.2.*
Прежде всего, учтите, что защита как маршрутов, так и контроллеров не нужна. Я лично всегда защищаю только контроллеры, так как к одному контроллеру может быть несколько маршрутов.
После того, как вы удалили либо маршрут, либо конфигурацию охранника контроллера, вы можете:
Установите Zend Developer Tools, который позволяет получить обзор текущей установленной роли Acl, как показано на следующем рисунке:
Проверьте, настроили ли вы правильный провайдер идентификации: по умолчанию один использует идентификатор пользователя ZfcUser и ищет его роль в
user_role
Таблица.- Проверьте, что
guest
роль имеет доступ к общедоступным страницам, таким какzfcuser
контроллер (для действий входа в систему) илиzfcuser/login
маршрут.
Как отметил Акрабат, конфигурация для BjyAuthorize\Guard\Controller
а также BjyAuthorize\Guard\Route
являются белыми списками, что в основном означает, что вы должны настроить доступ по умолчанию guest
роль, если вы хотите просматривать страницы без аутентификации.
Как только защита настроена, она блокирует доступ к любому ненастроенному ресурсу, поэтому убедитесь, что вы предоставили роль guest
(или что вы настроили в $config['bjyauthorize']['default_role']
получить доступ хотя бы к контроллеру входа или маршруту.
Как только вы создадите одну запись в 'BjyAuthorize\Guard\Controller'
массив, то вам нужно создать записи для каждого контроллера с соответствующими разрешениями.
У меня есть это:
'BjyAuthorize\Guard\Controller' => array(
// Access for everyone
array('controller' => 'zfcuser', 'roles' => array('guest')),
array('controller' => 'Application\Controller\Index', 'action' => 'index', 'roles' => array('guest')),
array('controller' => 'error', 'roles' => array('guest')),
// Restricted
array('controller' => 'User\Controller\AdminUser', 'roles' => array('admin')),
),
Важно, чтобы вы предоставили гостевой доступ к zfuser (для входа в систему!) И к ошибке (иначе сложно отладить).
Я не пробовал использовать контроллер и охрану маршрута одновременно.
У меня была точно такая же проблема.
Я думаю, что проблема в том, что BjyAuthorize плохо документирован, поэтому многие из нас просто копируют, вставляют и обрабатывают предоставленные файлы. Например, из следующего:
'BjyAuthorize\Guard\Controller' => array(
array('controller' => 'zfcuser', 'roles' => array()),
),
Вы ожидаете добавить свои контроллеры как таковые:
array('controller' => 'controllername', 'role' => array()),
Однако вам нужно добавить полный путь, иначе он не будет работать:
array('controller' => 'Folder/Controller/Action', 'role' => array()),
Я надеюсь, что это сэкономит кому-то несколько часов работы, так как я был совершенно сбит с толку этим!
Отладить ваш код этим в module.php
public function onBootstrap($e)
{ echo "<pre>";
var_dump($e->getTarget()->getServiceManager()->get('BjyAuthorize\Provider\Identity\ProviderInterface'));
}