Como resolver "Invalid credentials" na tela de login com Spring Security
Se você está com o problema de "Invalid credentials" mesmo após configurar tudo corretamente, pode ser que a senha armazenada no banco esteja incorreta ou não corresponda ao hash esperado pelo Spring Security.
Segue o passo a passo que usei para corrigir:
Injeção do PasswordEncoder no Service
No seu service, injete o encoder desta forma:
@Autowired
private PasswordEncoder encoder;
Alterações no método loadUserByUsername
Use o seguinte código para validar o encoder e gerar um hash válido para teste:
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// Mostra qual encoder está sendo usado
System.out.println("Encoder em uso: " + encoder.getClass().getName());
// Gera um hash de teste para a senha que deseja usar
String senhaCriptografada = encoder.encode("Maria123");
System.out.println("Nova senha cript: " + senhaCriptografada);
// Atualize essa senha no banco para o usuário correspondente
// Obs: Toda vez que rodar o projeto, o hash será diferente, mas isso não prejudica
var user = usuarioRepository.buscarUsuario(username)
.orElseThrow(() -> new UsernameNotFoundException("O usuário não foi encontrado! " + username));
System.out.println("Usuário encontrado: " + user.getEmail());
System.out.println("Senha no banco: " + user.getSenha());
System.out.println("Senhas iguais?: " + encoder.matches("Maria123", user.getSenha()));
return user;
}
Teste o login
- Use o email/nome do usuário cadastrado.
- Use a senha que você gerou (
Maria123
neste exemplo).
Se o log mostrar Senhas iguais?: true
, o login deve funcionar normalmente.
Dica: o problema geralmente não está na configuração do Spring Security, mas no hash da senha que está no banco. Sempre gere o hash usando o mesmo PasswordEncoder
que você injetou no Service. E também verifique se ele acha o usuário pelo nome.