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'));
    }
Другие вопросы по тегам