Symfony Action Security – Как выполнить пересылку после успешной аутентификации?
Вопрос
С помощью Action Security Symfony, если пользователь не был идентифицирован, он будет перенаправлен к действию входа в систему по умолчанию, как определено в файле settings.yml приложения.Как мне перенаправить пользователя к первоначально запрошенному действию после успешной аутентификации пользователя?
Решение
При первом нажатии на действие входа сохраните ссылку на сеанс пользователя:
if(!$this->getUser()->hasParameter('referer'))
{
$this->getUser()->setParameter('referer',$this->getRequest()->getReferer());
}
а затем, когда вход в систему будет успешным, перенаправьте пользователя на сохраненный реферер с помощью:
$this->redirect($this->getUser()->getParameter('referer'));
У вас есть полный пример в sfGuardPlugin:
Другие советы
Проще...
$this->getUser()->setReferer($this->getRequest()->getReferer());
нравиться
setReferer($referer)
{
if (!$this->hasAttribute('referer'))
$this->setAttribute('referer', $referer);
}
Связанная проблема, но вместо этого попытка выполнить пересылку из другого действия:
Если у вас есть действие, защищенное sfGuard, которое пытается перенаправить на реферера, после входа в систему вы получите цикл перенаправления.Это связано с тем, что страница входа в sfGuard станет реферером.Параметр или атрибут можно сохранить в нескольких запросах, если они сохранены в действии входа, как указано выше. Это означает, что действие может перенаправлять на неверную страницу, если вы уже вошли в систему.Решение — использовать вспышку, о которой вы забудете.Это можно сделать с помощью следующего кода в методе ExecuteSignin sfGuardAuthActions:
if ($this->getUser()->hasFlash('referer'))
{
$this->getUser()->setFlash('referer', $this->getUser()->getFlash('referer'));
}
else
{
$this->getUser()->setFlash('referer', $this->getRequest()->getReferer());
}
Сбросив флэш в первом блоке, он не будет забыт между попытками входа в систему, а с помощью флэша вход с других страниц не сможет помешать вашим действиям.