Не могу перехватить исключение брошенное из UserProvider в Symfony

В новой Symfony 6.1 пытаюсь реализовать авторизацию как по логину-паролю, так и через github. Написал для этих целей свой UserProvider. И вот его метод loadUserByIdentifier:

public function loadUserByIdentifier($username): UserInterface
{
    $chunks = explode(':', $username);
    file_put_contents("1985.txt", "\nUserProvider username: ".$username, FILE_APPEND);

    if (\count($chunks) === 2 && $user = $this->users->findForAuthByNetwork($chunks[0], $chunks[1])) {
        return $user; // Здесь проверяет - юзера НЕТ
    }

    if ( ! $user = $this->users->findForAuthByEmail($username)) // Здесь тоже юзера нет
    {
        throw new IdentiferNotFoundException(''); // Исключение толи НЕ бросается, толи метод authenticate его НЕ ловит...
    }

    return $user;
}

Иными словами, если в $username присутствует ":", значит юзер логинится через github с $username вида "github:105277821". А иначе это email.

Также я реализовал свой собственный GithubAuthenticator и вот его метод authenticate():

public function authenticate(Request $request): Passport
{
    $client = $this->clientRegistry->getClient('github_main');
    $accessToken = $this->fetchAccessToken($client);

    return new SelfValidatingPassport(
        new UserBadge($accessToken->getToken(), function() use ($accessToken, $client) {
            $githubUser = $client->fetchUserFromToken($accessToken);

            $network = "github";
            $id = (string)$githubUser->toArray()["id"];
            $username = $network.":".$id;
            file_put_contents("1985.txt", "\nGithubAuthenticator: ".$username, FILE_APPEND);
            $command = new Command($network, $id);

            try {
                return $this->userProvider->loadUserByIdentifier($username);
            } catch (IdentiferNotFoundException $e) {
                // ! ! ! НЕ могу попасть СЮДА ! ! !
                file_put_contents("1985.txt", "\nIdentiferNotFoundException thrown...", FILE_APPEND);
                $this->handler->handle($command); // Регаем юзера, если его нет
                return $this->userProvider->loadUserByIdentifier($username); // И снова логиним
            }
        })
    );
}

IdentiferNotFoundException просто расширяет Exception (Вместо него пробовал ставить UserNotFoundException - проблему это не решает)

 class IdentiferNotFoundException extends \Exception{}

А проблема состоит в том, что при входе через github нового юзера - должно бросаться исключение IdentiferNotFoundException из UserProvider, но оно толи не бросается, толи метод authenticate его НЕ ловит - не понятно. А вместо этого по неведомой причине юзера логинит через email. Почему так происходит и как исправить ситуацию, может кто-то объяснить?

Я записал некоторые логи через file_put_contents и вот что получал

GithubAuthenticator: github:107927341
UserProvider username: github:107927341
findForAuthByNetwork network: github:107927341
findForAuthByEmail Email: github:107927341
UserProvider username: [email protected]
findForAuthByEmail Email: [email protected]

То есть видно, что Authenticator вызывается правильный, затем он вызывает UserProvider, а UserProvider последовательно вызывает 2 метода findForAuthByNetwork и findForAuthByEmail, но вот затем исключение не бросается. А по непонятной причине он снова вызывает UserProvider с Email-м и логинит юзера по почте. Как такое может быть?


Ответы (0 шт):