Ho appena aggiunto una funzionalità di registrazione al mio nuovo progetto Grails. Per testarlo, mi sono registrato fornendo un'e-mail e una password. Sto usando l'algoritmo di bcrypt per hashing della password prima di salvarlo nel database.Bcrypt genera hash diversi per lo stesso input?
Tuttavia, quando provo ad accedere con la stessa e-mail e password che ho fornito durante la registrazione, l'accesso non riesce. Ho eseguito il debug dell'applicazione e ho scoperto che l'hash generato per la stessa password è diverso quando provo a confrontarlo con quello già estratto dal database e quindi l'accesso non riesce (Registration.findByEmailAndPassword (params.email, hashPassd) in LoginController.groovy restituisce null).
Ecco la mia classe di dominio Registration.groovy:
class Registration {
transient springSecurityService
String fullName
String password
String email
static constraints = {
fullName(blank:false)
password(blank:false, password:true)
email(blank:false, email:true, unique:true)
}
def beforeInsert = {
encodePassword()
}
protected void encodePassword() {
password = springSecurityService.encodePassword(password)
}
}
Ecco la mia LoginController.groovy:
class LoginController {
/**
* Dependency injection for the springSecurityService.
*/
def springSecurityService
def index = {
if (springSecurityService.isLoggedIn()) {
render(view: "../homepage")
}
else {
render(view: "../index")
}
}
/**
* Show the login page.
*/
def handleLogin = {
if (springSecurityService.isLoggedIn()) {
render(view: "../homepage")
return
}
def hashPassd = springSecurityService.encodePassword(params.password)
// Find the username
def user = Registration.findByEmailAndPassword(params.email,hashPassd)
if (!user) {
flash.message = "User not found for email: ${params.email}"
render(view: "../index")
return
} else {
session.user = user
render(view: "../homepage")
}
}
}
Ecco un frammento del mio Config.groovy dire graal di utilizzare bcrypt algoritmo di hash password e il numero di giri di calettamento:
grails.plugins.springsecurity.password.algorithm = 'bcrypt'
grails.plugins.springsecurity.password.bcrypt.logrounds = 16
Grazie Burt. Ha funzionato e davvero grazie per il suggerimento riguardante la memorizzazione di un utente nella sessione .Sono nuovo ai graal e lo sto usando per sviluppare un social sito di networking. Sarei davvero grato se puoi dare suggerimenti sulle migliori pratiche ecc. o qualsiasi cosa che aiuti .... potrebbe essere un link a un post sul tuo blog (un esercito di solipsisti ..... lo adoro) – adit