2013-08-02 22 views
9

Non riesco a capire come utilizzare SecurityServiceProvider in Silex. La mia configurazione è:Silex SecurityServiceProvider genera "Identificatore" security.authentication_providers "non definito".

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

Questo getta solo:

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

Secondo la documentazione in alcuni casi, quando si desidera accedere alle funzioni di sicurezza al di fuori del trattamento di una richiesta devi chiamare $app->boot(); ma questo non è la mia situazione
Se chiamo $app->boot(); prima $app->register(...) non sollevare alcuna eccezione, ma probabilmente non si avvia affatto, perché poi nel form di login generare Twig getta:

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

C'è an issue a few months ago probabilmente con lo stesso problema, ma è chiuso quindi suppongo che dovrebbe essere risolto ora

+0

Forse non relative al tuo problema, ma non compiere con uno dei due regole d'oro (sono dichiarate nei documenti): il tuo login_path DEVE essere definito FUORI dall'area riservata. Il tuo è in/_admin /, e la tua area riservata è in /_admin/.+ quindi non la stai definendo all'esterno. – mTorres

+0

Non penso. Expression '/ _admin /.+' non corrisponde al percorso '/ _admin /', quindi '/ _admin /' è al di fuori dell'area riservata. – martin

risposta

12

Stavo ricevendo la stessa eccezione quando cercavo di registrare lo SecurityServiceProvider prima dello TwigServiceProvider.

Ho appena cambiato l'ordine registrazione (SecuritydopoTwig) e tutto ha iniziato a funzionare bene:

// 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

Questo in realtà non registra le estensioni ramoscello (come 'is_granted') per Symfony sicurezza perché' controllate dopo TwigServiceProvider' se '$ app [ 'sicurezza']' è impostata e dal momento che si sta registrando '' SecurityServiceProvider' dopo TwigServiceProvider' ha vinto aggiungere l'estensione a Twig. – martin

+0

Hai ragione, questa era una soluzione rapida che usavo per avviare un'app quando non riuscivo a trovare il motivo dell'eccezione. La risposta di KuiKui sembra essere più ottimale. – agmangas

12

Bisogna avviare l'applicazione tra la registrazione SecurityServiceProvider e la registrazione 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__), 
)); 

Questo codice sopra sembra x il tuo problema ma devi almeno aggiungere un provider di autenticazione.

0

Mi sono imbattuto nello stesso problema, anche con la versione corrente di silex ~ 2.7.

Finalmente ho scoperto, che nel mio caso la componente "symfony/ramoscello-ponte" integrato tramite il compositore era il problema. Ho integrato tale componente ramoscello-ponte per utilizzare il tratto trans nei miei modelli ramoscello per la traduzione (ad esempio {{ 'Age'|trans }}). Dopo aver rimosso twig-bridge dal progetto, tutto ha funzionato come previsto.

Per poter utilizzare trans nei miei modelli mi hanno attuato un I18nExtension per me utilizzare ancora la sintassi caratteristica:

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