【问题标题】:Silex SecurityServiceProvider throws 'Identifier "security.authentication_providers" is not defined.'Silex SecurityServiceProvider 抛出“未定义标识符“security.authentication_providers”。
【发布时间】:2013-08-02 17:34:05
【问题描述】:

我不知道如何在Silex 中使用SecurityServiceProvider。我的配置是:

$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->register(...) 之前调用$app->boot();,它不会引发任何异常,但它可能根本不会启动,因为在生成登录表单时,Twig 会抛出:

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

an issue a few months ago 可能有同样的问题,但它已关闭,所以我想现在应该修复它

【问题讨论】:

  • 可能与您的问题无关,但您不符合两条黄金法则之一(它们在文档中说明):您的 login_path 必须在限制区域之外定义。你的在 /_admin/,你的限制区域在 /_admin/.+,所以你没有在外面定义它。
  • 我不这么认为。表达式/_admin/.+/_admin/ 路径不匹配,因此/_admin/ 在禁区外。

标签: php symfony silex


【解决方案1】:

您必须在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__),
));

上面的这段代码似乎可以解决您的问题,但您必须至少添加一个身份验证提供程序。

【讨论】:

    【解决方案2】:

    尝试在TwigServiceProvider 之前注册SecurityServiceProvider 时遇到了同样的异常。

    我刚刚更改了注册顺序(Security after 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());
    

    【讨论】:

    • 这实际上并没有为 Symfony Security 注册 Twig 扩展(如 is_granted),因为 TwigServiceProvider 检查是否设置了 $app['security'] 并且因为您在 TwigServiceProvider 之后注册了 SecurityServiceProvider不会将扩展添加到 Twig。
    • 你说得对,当我找不到异常背后的原因时,这是我用来启动和运行应用程序的快速解决方案。 KuiKui 的回答似乎更优化。
    【解决方案3】:

    我遇到了同样的问题 - 当前的 silex 版本 ~2.7 也是如此。

    最后我发现,在我的例子中,通过 composer 集成的“symfony/twig-bridge”组件是问题所在。我集成了 twig-bridge 组件以在我的 twig 模板中使用 trans 特征进行翻译(例如{{ 'Age'|trans }})。从项目中删除 twig-bridge 后,一切都按预期工作。

    为了在我的模板中使用 trans,我为自己实现了一个 I18nExtension 以仍然使用 trait 语法:

    <?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";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多