Запоминание пользователя при входе
Столкнулся с такой проблемой, когда авторизуешься и ставишь галочку «запомнить меня» при следующем входt не авторизует, хотя стоят куки (по умолчанию sfRemember).
Проблема связана с sfGuardBasicSecurityFilter. Как указано в документации, этот фильтр нужно включить следующем образом:
security: class: sfGuardBasicSecurityFilter
Но! Это будет работать только для страниц где is_secure on
Чтобы исправить ситуацию нам нужно подредактировать filters.yml и добавить свой фильтр на основе sfGuardBasicSecurityFilter. Такого содержания:
class myRememberFilter extends sfFilter { public function execute ($filterChain) { // execute this filter only once, and if the user is not already logged in, and has a cookie set if ($this->isFirstCall() && !$this->getContext()->getUser()->isAuthenticated() && $this->getContext()->getRequest()->getCookie(sfConfig::get('app_sf_guard_plugin_remember_cookie_name', 'sfRemember'))) { // See if a user exists with this cookie in the remember database $c = new Criteria(); $c->add(sfGuardRememberKeyPeer::REMEMBER_KEY, $this->getContext()->getRequest()->getCookie(sfConfig::get('app_sf_guard_plugin_remember_cookie_name', 'sfRemember'))); $c->add(sfGuardRememberKeyPeer::IP_ADDRESS, $this->getContext()->getRequest()->getHttpHeader ('addr','remote')); if ($resultArray = sfGuardRememberKeyPeer::doSelectJoinsfGuardUser($c)) { $resultRow = current($resultArray); $this->getContext()->getUser()->signIn($resultRow->getSfGuardUser()); } } // execute next filter $filterChain->execute(); } }
Сохраняем его как myRememberFilter.class.php в папке plugins\sfGuardPlugin\lib или любой другой удобной папке, чтобы autoloader смог его найти и подлючить.
Но! У выше приведенного кода есть один недостаток, авторизация произходит по куками и ip. Чтобы оставить только авторизацию по кукам нам нужно убрать/закомментировать этот кусок кода:
$c->add(sfGuardRememberKeyPeer::IP_ADDRESS, $this->getContext()->getRequest()->getHttpHeader ('addr','remote'));
Тогда у нас проверка будет идти только по кукам. В большинстве случаев этого вполне достаточно.
Изменяем filters.yml на
rendering: ~ remember: class: myRememberFilter security: class: sfGuardBasicSecurityFilter
Важно! Подключить фильтр после рендеринга (rendering) и перед security. И при следующей авторизации у вас все должно работать =)
Ссылки по теме:
http://trac.symfony-project.org/ticket/3868
http://symfo-blog.blogspot.com/2008/10/blog-post.html