3

アプリに基本的なフォームログイン認証があり、AuthenticationHandlerInterfaceを使用してハンドラーを設定します。この場合、onAuthenticationSuccess()メソッドでセッション変数を設定します。

問題は、(ROLE_ALLOWED_TO_SWITCHを使用して)別のユーザーに切り替えると、ハンドラーが呼び出されなくなり、以前に設定したセッション変数が、切り替える前のユーザーのもののままになることです。

例 :

  • ユーザーXでのロギング
  • セッション変数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/ SwitchUserEvent.php

したがって、このイベントをリッスンする必要がある/聞きたい場合があり、リスナーが呼び出されたときにロジックを実行します。

このイベントを聞くには、リスナーの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 に答える