Tôi vừa thêm chức năng đăng ký vào dự án Grails mới của mình. Để kiểm tra nó, tôi đã đăng ký bằng cách đưa ra một email và mật khẩu. Tôi đang sử dụng thuật toán bcrypt cho băm mật khẩu trước khi lưu nó vào cơ sở dữ liệu.Bcrypt tạo ra các băm khác nhau cho cùng một đầu vào?
Tuy nhiên khi tôi cố gắng đăng nhập bằng cùng một email và mật khẩu mà tôi đã cung cấp khi đăng ký, đăng nhập thất bại. Tôi đã gỡ lỗi ứng dụng và phát hiện ra rằng băm được tạo cho cùng một mật khẩu khác nhau khi tôi cố gắng so sánh với mật khẩu đã được băm từ cơ sở dữ liệu và do đó đăng nhập không thành công (Registration.findByEmailAndPassword (params.email, hashPassd) trong LoginController.groovy trả về null).
Đây là lớp tên miền của tôi 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)
}
}
Dưới đây là LoginController.groovy tôi:
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")
}
}
}
Dưới đây là một đoạn trích từ Config.groovy tôi nói grails sử dụng bcrypt thuật toán để băm mật khẩu và số vòng khóa:
grails.plugins.springsecurity.password.algorithm = 'bcrypt'
grails.plugins.springsecurity.password.bcrypt.logrounds = 16
Cảm ơn Burt. Nó thực sự cảm ơn đề xuất liên quan đến việc lưu trữ một người dùng trong phiên làm việc. Tôi mới sử dụng grails và đang sử dụng nó để phát triển một xã hội Tôi sẽ rất biết ơn nếu bạn có thể đưa ra đề xuất về các phương pháp hay nhất vv hoặc bất kỳ thứ gì có thể giúp .... có thể là một liên kết đến một bài đăng trên blog của bạn (một đội ngũ các nhà solipsists ..... tôi thích nó) – adit