Я только что добавил функцию регистрации в свой новый проект Grails. Для тестирования я зарегистрировался, указав адрес электронной почты и пароль. Я использую алгоритм bcrypt для хеширования пароля перед сохранением его в базе данных.
Однако, когда я пытаюсь войти в систему с тем же адресом электронной почты и паролем, которые я указал при регистрации, происходит сбой входа. Я отладил приложение и обнаружил, что хэш, сгенерированный для того же пароля, отличается, когда я пытаюсь сравнить его с уже хэшированным из базы данных, и, следовательно, происходит сбой входа в систему ( Registration.findByEmailAndPassword (params.email, hashPassd) ) в LoginController.groovy возвращает ноль ).
Вот мой класс домена 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)
}
}
Вот мой 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")
}
}
}
Вот фрагмент из моего Config.groovy, в котором говорится о том, чтобы использовать алгоритм bcrypt для хэширования паролей и количества циклов ввода:
grails.plugins.springsecurity.password.algorithm = 'bcrypt'
grails.plugins.springsecurity.password.bcrypt.logrounds = 16