2013-08-02 1 views
9

Je n'arrive pas à comprendre comment utiliser SecurityServiceProvider dans Silex. Ma configuration est:Silex SecurityServiceProvider renvoie «Identifiant» security.authentication_providers «n'est pas défini».

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

Ce juste lancers francs:

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

Selon la documentation dans certains cas, si vous souhaitez accéder à des fonctions de sécurité à l'extérieur de la manipulation d'une demande, vous devez appeler $app->boot(); mais ce n'est pas ma situation.
Si je l'appelle $app->boot(); avant $app->register(...) il ne soulève aucune exception, mais il ne probablement démarre pas du tout, car alors à générer formulaire de connexion Brindille lance:

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

Il y a an issue a few months ago avec probablement le même problème, mais il est fermé donc je suppose qu'il devrait être corrigé maintenant

+0

Peut-être pas lié à votre question, mais vous ne respectez pas l'un des deux règles d'or (elles sont indiquées dans les documents): votre login_path DOIT être défini en dehors de la zone réservée. La vôtre est à/_admin /, et votre zone restreinte est à /_admin/.+ donc vous ne la définissez pas à l'extérieur. – mTorres

+0

Je ne pense pas. L'expression '/ _admin /.+' ne correspond pas au chemin '/ _admin /', donc '/ _admin /' est en dehors de la zone restreinte. – martin

Répondre

12

Je recevais la même exception en essayant d'enregistrer le SecurityServiceProvider avant le TwigServiceProvider.

Je viens de modifier l'ordre enregistrement (sécuritéaprèsBrindille) et tout a commencé à fonctionner correctement:

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

Cela n'enregistre pas réellement les extensions Twig (comme 'is_granted') pour Symfony Security car' TwigServiceProvider' vérifie si '$ app ['security']' est défini et puisque vous enregistrez 'SecurityServiceProvider' après' TwigServiceProvider' il a gagné ne pas ajouter l'extension à Twig. – martin

+0

Vous avez raison, c'était une solution rapide que j'avais l'habitude de faire fonctionner une application quand je ne pouvais pas trouver la raison de l'exception. La réponse de KuiKui semble être plus optimale. – agmangas

12

Vous devez démarrer votre application entre l'enregistrement SecurityServiceProvider et l'enregistrement 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__), 
)); 

Ce code ci-dessus semble x votre problème mais vous devez au moins ajouter un fournisseur d'authentification.

0

J'ai rencontré le même problème - également avec la version actuelle de silex ~ 2.7.

Enfin, j'ai découvert que dans mon cas le composant "symfony/twig-bridge" intégré via composer était le problème. J'ai intégré ce composant twig-bridge pour utiliser le trait trans dans mes modèles de brindilles pour la traduction (par exemple {{ 'Age'|trans }}). Après avoir retiré le brindille du projet, tout a fonctionné comme prévu.

Pour utiliser trans dans mes modèles j'ai mis en place un I18nExtension pour moi-même toujours utiliser la syntaxe de 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"; 
    } 
} 
Questions connexes