2

SSO と FosUserBundle を使用する作業中の Symfony2 アプリケーションがあります。ただし、ユーザーがログインしたときにトリガーされる FosUserBundle イベントリスナーがあり、SSO バンドルが機能しなくなります。

app/config/config.ymlこの特定の FosUserBundle リスナーを簡単に無効にする方法はありますか?

PS。聞き手はFOS\UserBundle\EventListener\LastLoginListener::onSecurityInteractiveLogin

4

4 に答える 4

3

サービス定義を置き換えて、同じインターフェースを持つが何もしないスタブ クラスを使用できます。

services:
    acme.menu.adaptor:
        class: MyProject\Helper\NullMenuAdapter
        tags:
            -  { name: 'acme.menu.adaptor' }

サービスがタグに依存している場合は、タグを削除できる場合があります。

services:
    acme.menu.adaptor:
        class: Acme\Helper\RealMenuAdapter
#        tags:
#            -  { name: 'acme.menu.adaptor' }
于 2014-06-05T01:07:35.820 に答える
2

動作の一部を無効にするための構成を提供するのはバンドルの責任だと思います。

したがって、そうでない場合は、変更を加えて(デフォルトでイベントリスナーを有効にして)、PRを送信します:)

構成による有効化/無効化の例を次に示します。https ://github.com/KnpLabs/KnpRadBundle/blob/develop/DependencyInjection/KnpRadExtension.php#L27-L57

対応する構成の場合: https ://github.com/KnpLabs/KnpRadBundle/blob/develop/DependencyInjection/Configuration.php#L32-L38

于 2013-02-14T20:28:52.400 に答える
2

EventDispatcher のコードをざっと見てみると、config.yml で特定のリスナーを無効にする簡単な方法が見つかりません。

できることの 1 つは、LastLoginListener を独自のクラスで拡張し、パラメータfos_user.security.interactive_login_listener.class( https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/config/security.xmlを参照) を拡張クラスに設定することです。getSubscribedEvents()次のようなものでオーバーライドします。

public static function getSubscribedEvents()
{
    return array(
        FOSUserEvents::SECURITY_IMPLICIT_LOGIN => 'onImplicitLogin',
    );
}

SecurityEvents::INTERACTIVE_LOGINしたがって、イベントのサブスクリプションを削除します。

これがこれを行うための最もクリーンな方法かどうかはわかりませんが、おそらく必要なコード行数が最も少ない方法です。

編集:

私の答えをさらに詳しく説明すると、構成ファイルを介して特定のリスナー メソッドを無効にすることができないと思う理由は、LastLoginListener が kernel.event_subscriber タグを使用してカスタム イベントをリッスンしていることを示すためです。

このSymfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\RegisterKernelListenersPassクラスはgetSubscribedEvents()、kernel.event_subscriber タグを使用して各サービスのメソッドを呼び出し、返されたすべてのクラス + コールバックのイベント サブスクリプションを追加します。

これを設定するコードのどこにもオーバーライドがあるようには見えません。

ただし、これはすべてコードを調べることに基づいているため、見逃したオプションがどこかにある可能性があります。

于 2013-02-14T17:29:38.440 に答える