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 回答