The new Guard
is aimed to ease the implementation of custom authentication patterns such as yours.
It is likely to be enough for most of the case even complex ones.
However, try to extract your custom processing, logging, etc. from your Guard
and inject them to improve the maintainability of it.
Take a close look to GuardAuthenticatorInterface.php to find where and when in the process you have to set up your requirements.
solved Symfony 3, Guard & Handlers