3

我在我的应用程序中有一个基本的表单登录身份验证,我使用 AuthenticationHandlerInterface 设置了一个处理程序,其中我在 onAuthenticationSuccess() 方法中设置会话变量。

问题是当我切换到另一个用户(使用 ROLE_ALLOWED_TO_SWITCH)时,我的处理程序不再被调用,并且我之前设置的会话变量仍然是切换前的用户。

例子 :

  • 使用用户 X 登录
  • 将 session var myVar 设置为 X->someAttribute (在身份验证处理程序内)
  • 切换到用户 Y
  • 未调用处理程序:myVar 保持相同的值

(我知道 myVar = X->someAttribute 不是一个很好的例子,因为我已经可以从安全令牌对象访问它,但这是为了简化问题)

谢谢

编辑:security.yml 的摘录

firewalls:
    main:
        pattern:    ^/
        anonymous: ~
        switch_user: { role: ROLE_ADMIN, parameter: _switch }
        form_login:
            provider: sso
            success_handler: authentication_handler
            login_path: /login
            check_path: /login_check
        logout:
            path:   /logout
            target: /home
4

1 回答 1

6

当安全组件成功切换当前用户时,它会派发一个security.switch_user具有以下事件类的事件:https ://github.com/symfony/symfony/blob/2.0/src/Symfony/Component/Security/Http/Event/切换用户事件.php

因此,您可能需要/想要收听此事件,并在调用您的侦听器时执行您的逻辑。

要收听这个事件,请阅读关于 listeners 的 symfony 食谱条目:http: //symfony.com/doc/current/cookbook/service_container/event_listener.html

services:
    rocky.balboa.listener.security_switch_user:
        class: Rocky\BalboaBundle\Listener\SecuritySwitchUserListener
        tags:
            - { name: kernel.event_listener, event: security.switch_user, method: onSecuritySwitchUser }

.

// src/Rocky/BalboaBundle/Listener/SecuritySwitchUserListener.php

namespace Rocky\BalboaBundle\Listener;

use Symfony\Component\Security\Http\Event\SwitchUserEvent;

class SecuritySwitchUserListener
{
    public function onSecuritySwitchUser(SwitchUserEvent $event)
    {
        $newUser = $event->getTargetUser();
    }
}
于 2012-07-13T07:46:47.960 回答