Estou com uma dúvida em relação ao método gerarToken da classe TokenService, mais especificamente na seguinte linha:
Usuario logado = (Usuario) authentication.getPrincipal();
No método autenticar de AutenticacaoController recebemos como parâmetro um objeto do tipo LoginForm que possui apenas as informações de email e senha. Porém, após ser convertido em um objeto do tipo UsernamePasswordAuthenticationToken e ter um objeto do tipo Authentication gerado e passado como parâmetro para o método tokenService.gerarToken, foi possível recuperar um objeto do tipo Usuario através de uma chamada a authentication.getPrincipal(), onde além de email e senha também possui os atributos de id e nome. Gostaria que fosse explicado com maiores detalhes como o Spring conseguiu buscar o objeto do tipo Usuario.