Не могу перехватить исключение брошенное из 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-м и логинит юзера по почте. Как такое может быть?