2012-12-18 5 views
21

Ho costruito un progetto Silex con un meccanismo di login."Un token non è stato trovato nel SecurityContext" su Silex/Symfony

Non essendo un esperto di Symfony, ho seguito rigorosamente le linee guida qui per il processo di autenticazione: http://silex.sensiolabs.org/doc/providers/security.html

... e funziona bene sul mio ambiente di sviluppo

Tuttavia, quando ho spinto il mio progetto sulla mia server di produzione, ottengo il seguente errore ogni volta che cerco di accedere al mio web app

[2012-12-18 16:35:33] CRITICAL: Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException: 
A Token was not found in the SecurityContext. (uncaught exception) at 
/my/app/path/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/AccessListener.php line 53 [] [] 

che significa che il seguente codice nel AccessListener.php

$this->context->getToken()); 

genera expection

in considerazione del fatto che lo stesso codice funziona perfettamente bene sul mio ambiente di sviluppo, suppongo che abbia qualcosa a che fare con la mia configurazione server di produzione.

ho trovato questa discussione http://groups.google.com/forum/#!msg/symfony-devs/jKphNy_0Q2Y/vYfkAuyjSHEJ che propone di aggiungere la seguente riga al file .htaccess del mio progetto

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] 

senza alcun risultato. Ricevo ancora l'eccezione "Un token non trovato nell'eccezione SecurityContext".

Qualcuno ha un'idea?

Modifica Il contenuto del $app['security.firewalls'] è la seguente

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
'security.firewalls' => array(
'login' => array(
    'pattern' => '^/login$' 
), 
'admin' => array(
    'pattern' => '^/', 
    'form' => array('login_path' => '/login', 'check_path' => '/admin/login_check'), 
    'logout' => array('logout_path' => '/admin/logout'), // url to call for logging out 
    'users' => array(
    'admin' => array('ROLE_ADMIN', 'SOMEPASSWORD'), 
), 
) 
) 
)); 
+0

puoi pubblicare le impostazioni di '$ app ['security.firewalls']' array? –

+0

@ m2mdas: l'ho incluso sopra – benoit

+1

Prova ad aggiungere ''anonymous' => true,' nell'array del firewall 'login'. –

risposta

0

Molto probabilmente il motivo per cui questo funziona sul computer locale, ma non nel vostro ambiente produttivo è che .htaccess è supportato da Apache, mentre nginx does not bother wasting I/O and CPU time parsing this files

Se pubblichi il tuo .htaccess ti mostrerò come tradurre questo in una configurazione leggibile da nginx.

EDIT

Silex ha anche un esempio di configurazione per nginx

http://silex.sensiolabs.org/doc/web_servers.html

+1

Controlla il link che ho aggiunto sopra –

1

Sembra non ha nulla a che fare con HTTP Auth di base, perché non si utilizza in qualsiasi i tuoi firewall. Quello che si utilizza è un firewall con un punto di ingresso form, che quindi utilizza la sessione per memorizzare il token di sicurezza.

Ti suggerisco di esaminare in che modo le sessioni (e i cookie) sono gestite sul server di produzione rispetto al tuo ambiente di sviluppo.