четверг, 9 октября 2008 г.

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

В комплекте с sfGuardPlugin есть фильтр sfGuardBasicSecurityFilter для 'запоминания' пользователя при авторизации. Этот фильтр необходимо указать в filters.yml в качсестве security фильтра.
Все бы хорошо, но security фильтр запускается только при входе на защищенные страницы (is_secure: on). Учитывая что для первой (стартовой) страницы сайта защита обычно отключается - то фильтр не запускается и пользователь не опознается. Если продолжить путешествие по сайту и пройти в защищенную область - фильтр сработает и пользователь опознается.
Но как авторизировать его с первого раза?
Копируем sfGuardBasicSecurityFilter.class.php под именем myRememberFilter.class.php в папку lib своего application. Потом вносим небольшие изменения:

class myRememberFilter extends sfFilter
{
public function execute ($filterChain)
{
if ($this->isFirstCall() and !$this->getContext()->getUser()->isAuthenticated())
{
if ($cookie = $this->getContext()->getRequest()->getCookie(sfConfig::get('app_sf_guard_plugin_remember_cookie_name', 'sfRemember')))
{
$c = new Criteria();
$c->add(sfGuardRememberKeyPeer::REMEMBER_KEY, $cookie);
$rk = sfGuardRememberKeyPeer::doSelectOne($c);
if ($rk && $rk->getSfGuardUser())
{
$this->getContext()->getUser()->signIn($rk->getSfGuardUser());
}
}
}

$filterChain->execute();
}
}

Теперь остается в filters.yml прописать его как обычный фильр:

...
security: ~

# generally, you will want to insert your own filters here
remember:
class: myRememberFilter
...


Теперь пользователи опознаются сразу!

Комментариев нет: