Symfony Action Security - Как пересылать после успешной аутентификации?

С помощью Action Security Symfony, если пользователь не был идентифицирован, он будет перенаправлен на действие входа по умолчанию, как определено в файле settings.yml Applications. Как мне перенаправить пользователя к первоначально запрошенному действию после успешной аутентификации пользователя?

11.12.2008 09:28:22
3 ОТВЕТА
РЕШЕНИЕ

При первом обращении к действию входа в систему сохраните ссылку на сеанс пользователя:

if(!$this->getUser()->hasParameter('referer'))
{
  $this->getUser()->setParameter('referer',$this->getRequest()->getReferer());
}

и затем при успешном входе в систему перенаправьте пользователя на сохраненный реферер с помощью:

$this->redirect($this->getUser()->getParameter('referer'));

У вас есть полный пример в sfGuardPlugin:

http://www.symfony-project.org/plugins/sfGuardPlugin

8
27.07.2011 16:12:08

Проще ...

$this->getUser()->setReferer($this->getRequest()->getReferer());

подобно

setReferer($referer)
{
  if (!$this->hasAttribute('referer'))
    $this->setAttribute('referer', $referer);
}
1
9.09.2009 05:27:30
У меня были проблемы с использованием атрибута с именем 'referer'. Использование другого имени решило проблему.
Druckles 28.07.2011 16:38:10

Связанная проблема, но вместо этого попытка выполнить пересылку из другого действия:

Если у вас есть действие, защищенное 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());
}

Сбрасывая флэш-память в первом блоке, она не будет забыта между попытками входа в систему, а при использовании флэш-памяти вход с других страниц не может помешать вашему действию.

0
28.07.2011 17:53:34