Silex SecurityServiceProvider выдает «Идентификатор security.authentication_providers не определен».

Я не могу понять, как использовать SecurityServiceProvider в Silex. Моя конфигурация:

$app['security.firewalls'] = array(
    'admin' => array(
        'pattern' => '^/_admin/.+',
        'form' => array('login_path' => '/_admin/', 'check_path' => '/_admin/login_check'),
        'logout' => array('logout_path' => '/_admin/logout'),
        'users' => array(
            'admin' => array('ROLE_ADMIN', '5FZ2Z8QIkA7UTZ4BYkoC+GsR...'),
        ),
    ),
);
$app->register(new Silex\Provider\SecurityServiceProvider());

Это просто бросает:

Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Identifier "security.authentication_providers" is not defined.'

Согласно документации, в некоторых случаях, когда вы хотите получить доступ к функциям безопасности за пределами обработки запроса, вы должны вызвать $app->boot();, но это не моя ситуация.
Если я вызову $app->boot(); до $app->register(...), это не вызовет никаких исключений. но, вероятно, он вообще не загружается, потому что тогда при создании формы входа Twig выдает:

Unable to generate a URL for the named route "_admin_login_check" as such route does not exist.

Несколько месяцев назад была проблема, вероятно, с той же проблемой, но она закрыта, так что я думаю должно быть исправлено сейчас


person martin    schedule 02.08.2013    source источник
comment
Возможно, это не связано с вашей проблемой, но вы не выполняете одно из двух золотых правил (они указаны в документах): ваш login_path ДОЛЖЕН быть определен ВНЕ зоны ограниченного доступа. Ваш находится в /_admin/, а ваша ограниченная область находится в /_admin/.+, поэтому вы не определяете ее снаружи.   -  person mTorres    schedule 07.12.2013
comment
Я так не думаю. Выражение /_admin/.+ не соответствует пути /_admin/, поэтому /_admin/ находится вне зоны ограниченного доступа.   -  person martin    schedule 12.02.2014


Ответы (3)


Я получал такое же исключение при попытке зарегистрировать SecurityServiceProvider перед TwigServiceProvider.

Я просто изменил порядок регистрации (Безопасность после Twig), и все заработало нормально:

// Twig service

$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => sprintf("%s/../views", __DIR__),
));

// Security service

$app["security.firewalls"] = array();
$app->register(new Silex\Provider\SecurityServiceProvider());
person agmangas    schedule 23.12.2013
comment
Это на самом деле не регистрирует расширения Twig (например, is_granted) для Symfony Security, потому что TwigServiceProvider проверяет, установлено ли $app['security'], и поскольку вы регистрируете SecurityServiceProvider после TwigServiceProvider, это не добавит расширение в Twig. - person martin; 14.04.2015
comment
Вы правы, это было быстрое решение, которое я использовал, чтобы запустить приложение, когда я не мог найти причину исключения. Ответ КуиКуи кажется более оптимальным. - person agmangas; 14.04.2015

Вы должны загрузить свое приложение между регистрацией SecurityServiceProvider и регистрацией TwigServiceProvider:

// Security service
$app["security.firewalls"] = array();
$app->register(new Silex\Provider\SecurityServiceProvider());

// Boot your application
$app->boot();

// Twig service
$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => sprintf("%s/../views", __DIR__),
));

Этот код выше, похоже, решает вашу проблему, но вы должны добавить хотя бы одного поставщика аутентификации.

person KuiKui    schedule 04.01.2014

Я столкнулся с той же проблемой - также с текущей версией silex ~ 2.7.

В конце концов я обнаружил, что в моем случае проблема заключалась в компоненте "symfony/twig-bridge", интегрированном через композитор. Я интегрировал этот компонент twig-bridge, чтобы использовать трейт trans в моих шаблонах twig для перевода (например, {{ 'Age'|trans }}). После удаления twig-bridge из проекта все заработало как положено.

Чтобы использовать транс в своих шаблонах, я реализовал для себя I18nExtension, чтобы по-прежнему использовать синтаксис типажа:

<?php 

namespace AppBundle\Utils;

class I18nExtension extends \Twig_Extension {
    private $app;

    /**
     * Register the extension after registering the TwigServiceProvider by
     * $app['twig']->addExtension(new AppBundle\Utils\I18nExtension($app));
     */
    public function __construct(\Silex\Application $app) {
        $this->app = $app;
    }

    /**
     * Provide an additional simple filter called trans - calling 
     * the translate function specified below.
     */
    public function getFilters() {
        return array(
            new \Twig_SimpleFilter('trans', array($this, 'translate')),
        );
    }

    /**
     * Translates the given $value using the translator registered in the app.
     */
    public function translate($value) {
        return $this->app['translator']->trans($value);
    }

    /**
     * Name of the extension.
     */
    public function getName() {
        return "I18nExtension";
    }
}
person Sebastian    schedule 18.08.2015