2012-04-08 5 views
8

Sto utilizzando la mia classe utente come provider di entità per il sistema di sicurezza in symfony 2.0.Symfony 2 - come disabilitare l'interrogazione dell'utente ad ogni caricamento della pagina?

ho notato che su ogni reload della pagina symfony sta raggiungendo utente db:

SELEZIONA t0.id AS ID1, t0.username AS nomeutente2, t0.salt AS salt3, t0.password AS password4, t0.email AS email5, t0.is_active AS is_active6, t0.credentials AS credentials7 FROM w9_users t0 WHERE t0.id =? Parametri: ['23'] Tempo: 4,43 ms

C'è un modo semplice per disattivare questo comportamento? Magari serializzare i dati dell'utente nelle variabili di sessione o metterli in una cache in qualche modo?

risposta

11

È possibile modificare questo comportamento nel metodo refreshUser del proprio UserProvider.

Si dovrebbe fare attenzione quando si fa questo con la dottrina: There is an issue at FosUserBundle github, spiegando le insidie:

riporlo nella sessione porterebbe a diversi problemi, è per questo che non è fatto per impostazione predefinita:

se un amministratore modifica le autorizzazioni di un utente, le modifiche avranno un effetto solo la volta successiva che si recupera l'utente dal database. Quindi, per evitare problemi di sicurezza, l'utente deve fare attenzione alla cache

se si riutilizza semplicemente l'utente che è stato serializzato nella sessione, non sarà più gestito da Doctrine. Ciò significa che non appena si desidera modificare l'utente o utilizzare l'utente in una relazione, sarà necessario unirlo nuovamente a UnitOfWork (che restituirà un oggetto diverso da quello utilizzato dal firewall). L'unione attiverà anche una query DB. E richiedere tale logica interromperà alcuni dei controller incorporati che si aspettano di essere in grado di utilizzare l'oggetto utente per gli aggiornamenti.

Problemi correlati