Usando hash de senha BCrypt com o plugin Spring Security Grails
Estou tentando usar o hash de senha BCrypt no meu aplicativo Grails que usa o plug-in Spring Security. Ativei o BCrypt adicionando o seguinte aoConfig.groovy
grails.plugins.springsecurity.password.algorithm = 'bcrypt'
E eu defini o seguinte codec para simplificar o uso do BCrypt para codificar senhas:
public class PasswordCodec {
// it doesn't seem to be possible to dependency-inject codecs, so lookup the bean ourselves
@Lazy
private static PasswordEncoder passwordEncoder = Holders.grailsApplication.mainContext.getBean('passwordEncoder')
static encode = { str ->
passwordEncoder.encodePassword(str.toString(), null)
}
}
Quando inicio o aplicativo no modo dev, o banco de dados é inicializado com algumas contas (cada uma com a mesma senha, por exemplo
3.times { i ->
def username = "user$i"
def password = "secret".encodeAsPassword()
new User(username: username, password: password).save()
// also assign the user a role
}
Se eu procurar no banco de dados, vejo que o valor codificado da senha de cada um desses usuários é diferente! Portanto, não é surpresa que, quando um usuário tenta efetuar login e digita uma senha "secreta", o valor da senha codificada em BCrypt não corresponde ao que é salvo no banco de dados, porque parece que o valor codificado em BCrypt de uma String muda de alguma forma hora extra.
Obviamente, estou fazendo algo errado aqui, mas não faço ideia do que?