6

FOSRestBundle を使用して、ファイアウォール内で ajax json 呼び出しを行います。セッションタイムアウトが発生したときに処理できないことを除いて、すべてがうまく機能しているようです。現在、このシナリオでは login_check にリダイレクトされ、json ではなく html がクライアントに返されます。

私は気づいており、アプリ内で success_handler と failure_handler を使用しています。セッション タイムアウトなどの認証エラーを処理するためのビルトイン ハンドラーが見つかりません。

これに対処するのに役立つ何かが FOSRestBundle 内にありますか、それとも Symfony2 内で見られないものがありますか?

4

2 に答える 2

5

はい、Symfony は例外を処理する可能性を提供します。kernel.exception優先度の高いイベントを監視するイベント リスナーを作成する必要があります。次のようなイベント ハンドラーを作成します。

<?php
namespace Acme\Bundle\MyBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\Exception\AuthenticationException;

class AjaxAuthenticationListener
{
    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        $request = $event->getRequest();

        $format = $request->getRequestFormat();
        $exception = $event->getException();
        if ('json' !== $format || (!$exception instanceof AuthenticationException && !$exception instanceof AccessDeniedException)) {
            return;
        }

        $response = new JsonResponse($this->translator->trans($exception->getMessage()), $exception->getCode());
        $event->setResponse($response);
        $event->stopPropagation();
    }
}

次のように、 service.ymlの1 つにイベント ハンドラーを登録する必要があります。

kernel.listener.ajax_authentication_listener:
    class: Acme\Bundle\MyBundle\EventListener\AjaxAuthenticationListener
    tags:
        - { name: kernel.event_listener, event: kernel.exception, method: onKernelException, priority: 250 }

priority優先度の低い独自のハンドラーの前にハンドラーを実行するように Symfony に指示するために使用されるパラメーターに注意してください。

フロントエンドでは、jQuery のイベント ハンドラーを登録できます。これにより、このようなエラーでページがリロードされます。

$(document).ready(function() {
    $(document).ajaxError(function (event, jqXHR) {
        if (403 === jqXHR.status) {
            window.location.reload();
        }
    });
});

この要旨を参照してください。

于 2014-06-17T09:00:45.197 に答える
0

FOSRest バンドル内に明示的に何かがあるかどうかはわかりませんが、Symfony2 自体はセッション タイムアウトを処理できます。

ここ見てみましたか?http://symfony.com/doc/current/components/http_foundation/session_configuration.html

于 2013-07-01T14:41:34.017 に答える