UserDetailsService
O método do UserDetailsService é tentar encontrar um usuário por Username. Como nosso Username na verdade é o email, precisamos:
Criar um UserRepository com o método "findByEmail". Como já sabemos, o Repository consegue realizar a busca em virtude do "by". Para que ele consiga também buscar as roles desse usuário, faremos uma consulta SQL raíz.
Nesse ponto, nós já sabemos!
Criar uma UserDetailsProjection no pacote projections, com os atributos em get:
Fazer a consulta no UserRepository, usando o projection com o SQL
Injetar esse Repository no UserService, e utilizá-lo dentro do método advindo da interface (UserDetailsService):
Criaremos uma lista do tipo projection e usamos o método do repository passando o username;
Se ela estiver vazia, lançamos a exceção;
Caso contrário, instanciaremos um User, setaremos o seu email e password;
Para settar as roles, faremos um for:
Para cada Projection dentro da lista result, entraremos no objeto User e utilizaremos o método addRole;
Dentro dele, criaremos um new Role, passando o roleId e tipo de authority :)
Retorna o user depois.
Atualizado