Php 在Symfony 4.1中使用自定义用户检查器时捕获DisabledException

Php 在Symfony 4.1中使用自定义用户检查器时捕获DisabledException,php,symfony,authentication,Php,Symfony,Authentication,我在Symfony中实现了一个自定义用户检查器。我需要它来执行额外的检查,以确定尝试登录的帐户是否处于活动状态 这是我的用户检查代码: class UserChecker implements UserCheckerInterface { public function checkPreAuth(UserInterface $user) { if (!$user->getUser()->getIsActive()) { throw

我在Symfony中实现了一个自定义用户检查器。我需要它来执行额外的检查,以确定尝试登录的帐户是否处于活动状态

这是我的用户检查代码:

class UserChecker implements UserCheckerInterface {

    public function checkPreAuth(UserInterface $user) {
        if (!$user->getUser()->getIsActive())  {
            throw new DisabledException("Account is disabled.");
        }  else  {
            return;
        }
    }

    public function checkPostAuth(UserInterface $user) {
        return;
    }
}
在本例中,DI传入的
$user
对象只是我的用户对象的包装器(实现UserInterface)。我的用户对象有一个bool标志
isActive
。如果
getIsActive
返回false,我的条件将否定该值,并且它将抛出
DisabledException

然而,这不是我看到的行为。如果我使用活动用户登录,我可以很好地登录。如果我使用禁用的用户登录,它只会将我返回到登录屏幕(不会引发异常)

如果我将
DisabledException
更改为简单的
Exception
,则会引发异常,但我在代码中看不到可以捕捉到异常的位置,因此我可以在登录屏幕上方向用户显示一条漂亮的“帐户已禁用”消息

我假设Symfony在某处捕捉并吞下了
DisabledException

这是我的
安全性。yaml

security:
    providers:
        db_provider:
            id: database_user_provider
    encoders:
        App\Utility\Security\DatabaseUser: bcrypt
    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: db_provider
                login_path: login
                check_path: process_login
                default_target_path: do_some_stuff
                use_referer: true
            user_checker: App\Utility\Security\UserChecker
            anonymous: ~
            logout:
                path: logout
                target: login

    access_control:
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/userRegister, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, roles: ROLE_USER }
我的问题是:在哪里捕获异常/我需要覆盖或实现什么,以便向用户发送消息


在哪里可以捕获异常来执行相同的操作?

实际上有多种方法可以处理此问题,但我可以为您指出的一种方法适用于旧版本,但仍然有效@埃雷斯德夫。。。是的。。。成功了。谢谢