如何在Symfony2中使用SwitchUserListener?

时间:2012-09-17 07:50:21

标签: php symfony

当用户冒充其他用户时,我正在尝试重定向。

为此,我注册了一项服务:

ACME_listener.security_switch_user:
    class: ACME\CustomerLoginBundle\Listener\SecuritySwitchUserListener
    arguments:  [@service_container, @router, @security.context]
    tags:
        - { name: kernel.event_listener, event: security.switch_user, method: onSecuritySwitchUser }

我的监听器类看起来像这样:

namespace ACME\CustomerLoginBundle\Listener;

use Symfony\Component\Security\Http\Event\SwitchUserEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Security\Http\Firewall\ListenerInterface;

class SecuritySwitchUserListener implements ListenerInterface {
    public function __construct($appContainer, $router) {
        $this->router = $router;
        $this->appContainer = $appContainer;
    }

    public function onSecuritySwitchUser(SwitchUserEvent $event) {
       echo "im in here!";
      // this does get called

    }

    public function handle(GetResponseEvent $event) {
        echo "but not here :(";
        // this does not get called!
    }

}

现在问题是我无法从onSecuritySwitchUser方法中重定向用户。返回RedirectResponse不起作用且SwitchUserEvent没有setResponse()方法。

我必须做什么才能调用handle()方法?

1 个答案:

答案 0 :(得分:0)

我认为handle()来自onSecuritySwitchUser()。但我错了。

<强>更新

您可以使用自己的请求覆盖该事件:)

看看:

Symfony\Component\Security\Http\Firewall\SwitchUserListener

然后使用覆盖请求Dispach新的SwitchUserEvent

if (null !== $this->dispatcher) {
        $switchEvent = new SwitchUserEvent($request, $token->getUser());
        $this->dispatcher->dispatch(SecurityEvents::SWITCH_USER, $switchEvent);
}

也许这会对你有帮助。