Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Spring security

Tenho uma demanda.

Para o usuário alterar sua senha, ele deve confirmar a atual;

Mas não consigo validar a atual, por mais que copio igual

Que está no banco:

$2a$10$sy3zDdLq3E/qhKFt3fPPCu8SWM4I7RxZ3V/DggmIKXl9fnSUh6G66

Quando digito: $2a$10$KYjgIOwuZ6CPUJsi0u2zhOu0Ws2jeh8.xu9Z6LjqltUQuV9kePOwi

webSecurity

@Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

Quando salvo

usuario.setSenha(passwordEncoder.encode(usuario.getSenha()));

Quando faço a validação

passwordEncoder.encode(senhaAtual) <- essa informação nunca bate com a do banco de dados

if (!passwordEncoder.matches(passwordEncoder.encode(senhaAtual), usuario.get().getSenha())) {

2 respostas

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

solução!

Obrogado pelo retorno, mas ontem a noite eu consegui resolver da sequinte forma.

BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(16);
String result = passwordEncoder.encode(resource.getSenhaAtual());
boolean senhaAtualValida = BCrypt.checkpw(resource.getSenhaAtual(), usuario.getSenha());

Mas valeu pela ajuda.