切换用户时未调用认证处理程序

时间:2012-07-13 07:18:05

标签: authentication symfony handler switch-user

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

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

示例:

  • 使用用户X登录
  • 将会话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

1 个答案:

答案 0 :(得分:6)

当安全组件成功切换当前用户时,它将使用以下事件类调度事件security.switch_user

所以你可能需要/想听这个事件,并在你的听众被召唤时做你的逻辑。

要收听此活动,请阅读有关听众的symfony食谱条目:https://github.com/symfony/symfony/blob/2.0/src/Symfony/Component/Security/Http/Event/SwitchUserEvent.php

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();
    }
}