Iremos ao UserRepository e criar um método para encontrar um User. Usaremos os query methods da JPA mesmo.
//interassante colocar em Optional, pois caso o User não exista
//ele volta um Optional vazio.
Optional<User> findByEmail(String email);
No UserService, criaremos um método para isso. Ele será protected, só será possível chamá-lo nas classes de service.
Essa função irá retornar um User.
Voltando para o método do UserService o parâmetro usado dentro da chamada do repository será advindo dos códigos abaixo.
protected User authenticate() {
try {
//Pega um objeto do tipo authentication dentro do Spring Security.
//Ou seja, se tem um cara autenticado ele pega.
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
//pegando o user autenticado (dentro de authentication) faremos o casting para JWT,
//e usaremos o getPrincipal.
Jwt jwtPrincipal = (Jwt) authentication.getPrincipal();
//O getPrincipal por sua vez, possui os claims (onde foi configurado dentro do
//pacote config). A partir disso, podemos recuperar o seu username (email)
String username = jwtPrincipal.getClaim("username");
return userRepository.findByEmail(username).get();
}
catch (Exception e) {
throw new UsernameNotFoundException("User not found");
}
}
E se o User estiver vazio ou não tiver logado? Lança a exception.