0

AdvancedUserInterfaceを実装するユーザー向けのカスタム ロジックを実装したいと考えています。

有効になっていないユーザーが一部のゾーンにアクセスできるようにしたいと考えています (アカウント ゾーンなど、間違えた場合に電子メールを変更できる)。

ドキュメントによると:

このインターフェイスのいずれかのメソッドが false を返す場合、認証は失敗します。

これらの状況のいずれかでカスタム ロジックを実行する必要がある場合は、例外リスナーを登録し、それぞれのケースでスローされる特定の例外インスタンスを監視する必要があります。すべての例外は AccountStatusException のサブクラスです

そこで、このクックブックの記事をセキュリティ イベントに適応させてリスナーを作成しようとしました。

<?php

namespace Acme\DemoBundle\Listener;


use Symfony\Component\Security\Core\SecurityContextInterface;

use Symfony\Component\Security\Core\Exception\AccountStatusException;

class NecdocPatientExceptionListener
{
    public function onKernelException($event)
    {
        // Handle event code goes here
    }
}

そして、バンドルの services.xml に追加しました:

services:
    kernel.listener.acme_user_exception_listener:
        class: Acme\DemoBundle\Listener\AcmeExceptionListener
        tags:
            - { name: kernel.event_listener, event: security.authentication.success, method: onKernelException }

これはAuthenticationFailureEventをキャッチします (onKernelException が呼び出されます) が、AccountStatusExceptionはキャッチしません(onKernelException は呼び出されません)。

セキュリティ コンポーネントのコードを調べたところ、イベントをトリガーせずに例外がキャッチされているようです。とにかくこれらの例外をキャッチする方法はありますか?

4

1 に答える 1

0
namespace Acme\DemoBundle\Listener;

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Exception\AccountStatusException;

class AcmeExceptionListener
{
    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        // We get the exception object from the received event
        $exception = $event->getException();
        $message = 'My Error says: ' . $exception->getMessage() . ' with code: ' . $exception->getCode();

        // Customize our response object to display our exception details
        $response = new Response();
        $response->setContent($message);

        // Checks that the exception is an account status exception
        if ($exception instanceof AccountStatusException) {
            $response->setStatusCode($exception->getStatusCode());
            $response->headers->replace($exception->getHeaders());
        } else {
            $response->setStatusCode(500);
        }

        // Send our modified response object to the event
        $event->setResponse($response);
    }
}
于 2012-11-06T20:51:47.613 に答える