2013-08-02 4 views
9

Ich kann nicht herausfinden, wie SecurityServiceProvider in Silex zu verwenden. Meine Konfiguration ist:Silex SecurityServiceProvider löst aus, der Identifikator "security.authentication_providers" ist nicht definiert. '

$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()); 

Das gerade wirft:

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

Gemäß der Dokumentation in einigen Fällen, wenn Sie Sicherheitsfunktionen außerhalb der Bearbeitung eines Antrags zugreifen möchten, müssen Sie $app->boot(); nennen, aber diese ist nicht meine Situation.
Wenn ich rufe $app->boot(); vor $app->register(...) es keine Ausnahme aus, aber es ist wahrscheinlich nicht booten, weil dann bei der Erzeugung von Login-Formular Zweig wirft:

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

Da ist an issue a few months ago mit wahrscheinlich dem gleichen Problem, aber es ist geschlossen also ich denke, es sollte jetzt behoben werden

+0

Vielleicht nicht zu Ihrem Problem im Zusammenhang, aber sie erfüllen nicht mit einem der beiden:

Um in meinen Vorlagen trans zu verwenden Ich habe eine I18nExtension für mich die Eigenschaft Syntax verwenden, um noch umgesetzt goldene Regeln (sie sind in den Dokumenten angegeben): Ihr Login-Pfad MUSS außerhalb des geschützten Bereichs definiert werden. Dein ist bei/_admin/und dein eingeschränkter Bereich ist bei /_admin/.+, also definierst du ihn nicht außerhalb. – mTorres

+0

Ich glaube nicht. Ausdruck '/ _admin /.+' passt nicht zu '/ _admin /' Pfad, also '/ _admin /' ist außerhalb des eingeschränkten Bereichs. – martin

Antwort

12

Ich bekam die gleiche Ausnahme beim Versuch, die SecurityServiceProvider vor der TwigServiceProvider zu registrieren.

Ich habe gerade die Registrierung Ordnung (SicherheitnachZweig) und alles begann zu funktionieren:

// 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()); 
+1

Dies registriert Twig-Erweiterungen (wie 'is_granted') für Symfony Security nicht, da' TwigServiceProvider' überprüft, ob '$ app ['security']' gesetzt ist und seit Sie 'SecurityServiceProvider' nach' TwigServiceProvider' registriert haben, hat es gewonnen füge die Erweiterung nicht zu Twig hinzu. – martin

+0

Sie haben Recht, das war eine schnelle Lösung, die ich verwendet habe, um eine App zum Laufen zu bringen, als ich den Grund für die Ausnahme nicht finden konnte. KuiKuis Antwort scheint optimaler zu sein. – agmangas

12

Sie haben Ihre Anwendung zwischen der SecurityServiceProvider Anmeldung und der TwigServiceProvider Registrierung zu starten:

// 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__), 
)); 

Dieser Code oben scheint zu fi x Ihr Problem, aber Sie müssen mindestens einen Authentifizierungsanbieter hinzufügen.

0

Ich stieß auf das gleiche Problem - auch mit der aktuellen Silex-Version ~ 2.7.

Endlich fand ich heraus, dass in meinem Fall die über Composer integrierte Komponente "symfony/twig-bridge" das Problem war. Ich integrierte diese Zweigbrückenkomponente, um das trans Merkmal in meinen Zweigvorlagen für die Übersetzung zu verwenden (z. B. {{ 'Age'|trans }}). Nach dem Entfernen der Zweigbrücke vom Projekt funktionierte alles wie erwartet.

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