2008-12-11 36 views
1

使用Symfony的Action Security(如果用户未被识别),他将被转发到默认的登录动作,如application settings.yml文件中所定义的。用户成功通过身份验证后,如何将用户转发到最初请求的操作?Symfony Action安全 - 成功验证后如何转发?

回答

8

在先打到你的登录操作,存储引荐到用户会话:

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

1

更简单地说...

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

setReferer($referer) 
{ 
    if (!$this->hasAttribute('referer')) 
    $this->setAttribute('referer', $referer); 
} 
+0

我在使用名称为'referer'的属性时遇到问题。用不同的名字解决了这个问题。 – Druckles 2011-07-28 16:38:10

0

一个相关的问题,而是试图从不同的动作进行着:

如果您有通过sfGuard保护的一个行动,这尝试重定向到引用链接,您将在登录后获得重定向循环。这是因为sfGuard的登录页面将成为引用链接。如果在上述登录操作中存储了参数或属性,则可以将这些参数或属性保存在多个请求中,这意味着如果已登录,操作可能会重定向到不正确的页面。解决方案是使用闪存,这将被遗忘。这可以用在sfGuardAuthActions的executeSignin方法下面的代码来实现:

if ($this->getUser()->hasFlash('referer')) 
{ 
    $this->getUser()->setFlash('referer', $this->getUser()->getFlash('referer')); 
} 
else 
{ 
    $this->getUser()->setFlash('referer', $this->getRequest()->getReferer()); 
} 

通过重置在第一块中的闪光灯,它不会被登录尝试之间遗忘,并通过使用闪光灯,从登录其他网页无法干扰您的操作。