2012-04-08 4 views
8

Я использую свой собственный пользовательский класс как поставщик сущности для системы безопасности в symfony 2.0.Symfony 2 - как отключить запрос пользователя при загрузке каждой страницы?

Я заметил, что на каждой перезагрузки страницы Symfony является извлечение пользователя из БД:

ВЫБРАТЬ t0.id AS id1, t0.username А.С. USERNAME2, t0.salt А.С. salt3, t0.password А.С. password4, t0.email AS email5, t0.is_active AS is_active6, t0.credentials AS credentials7 FROM w9_users t0 WHERE t0.id =? Параметры: ['23'] Время: 4.43 мс

Есть ли какой-либо простой способ отключить эту функцию? Может быть, сериализовать пользовательские данные в переменных сеанса или кэшировать их каким-то образом?

ответ

11

Вы можете изменить это поведение способа refreshUser вашего UserProvider.

Вы должны быть осторожны, делая это с доктриной: There is an issue at FosUserBundle github, объясняя подводные камни:

хранить его в сессии может привести к нескольким проблемам, поэтому это не сделано по умолчанию:

, если администратор изменяет разрешения пользователя, изменения будут иметь эффект только в следующий раз, когда вы извлечете пользователя из базы данных. Поэтому кеширование пользователя должно быть сделано тщательно, чтобы избежать проблем с безопасностью. Если вы просто повторно используете пользователя, который был сериализован в сеансе, он больше не будет управляться с помощью Doctrine.

. Это означает, что, как только вы захотите изменить пользователя или использовать пользователя в отношении, вам придется объединить его обратно в UnitOfWork (который вернет другой объект, чем тот, который используется брандмауэром). Слияние также вызовет запрос БД. И требующая такой логики сломает некоторый встроенный контроллер, который ожидает, что сможет использовать объект пользователя для обновлений.