Fala Guilherme, tudo bem?
Esse é o comportamento esperado do BCryptPasswordEncoder
mesmo, ele utilizar internamente uma classe chamada de SecureRandom
do próprio java, dessa forma toda vez que você chamar o método encode
ele irá gerar um hash
diferente para você.
Você consegue ter uma ideia melhor do que ocorre, executando esse código abaixo:
class Teste {
public static void main(String[] args) {
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String minhaSenha = "alefh";
for (int i = 0; i < 5; i++) {
System.out.println(encoder.encode(minhaSenha));
}
}
}
O problema que você está tendo ocorre pelo seguinte motivo:
Você está copiando o hash
salvo no banco de dados e falando que essa é a "senha" do usuário, quando na verdade não é, ele é um hash
que representa a senha do usuário. Para que seu código funcione da forma que você deseja, você precisa receber a senha do usuário em plain-text que signfica texto simples, com isso você consegue fazer a validação e realizar a troca da senha do usuário.
Aqui está um pseudo código, sobre o que você deve fazer na sua aplicação:
class Teste {
public static void main(String[] args) {
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String minhaSenhaEmPlainText = "alefh";
for (int i = 0; i < 5; i++) {
String hashSenha = encoder.encode(minhaSenhaEmPlainText);
System.out.println(hashSenha + " - eh igual: " + encoder.matches(minhaSenhaEmPlainText, hashSenha));
}
}
}
espero que tenha te ajudado.
Abraço