Запоминание пользователя при входе

Symfony framework

Автор: Александр Степанов

1 нояб. 2011 г., 09:03:43  833


Столкнулся с такой проблемой, когда авторизуешься и ставишь галочку «запомнить меня» при следующем вход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