在grails中验证密码和确认密码的最佳方法是什么?
我有一个包含密码和密码确认字段的域类。 这两者分别得到验证。 什么是验证这两者相等的最佳实践在grails中验证密码和确认密码的最佳方法是什么?,grails,Grails,我有一个包含密码和密码确认字段的域类。 这两者分别得到验证。 什么是验证这两者相等的最佳实践 class User { String password String passwordConfirm static constraints = { password blank: false, nullable: false, minSize: 8, maxSize: 64, validator: {password, obj -> def password
class User {
String password
String passwordConfirm
static constraints = {
password blank: false, nullable: false, minSize: 8, maxSize: 64, validator: {password, obj ->
def password2 = obj.passwordConfirm
password2 == password ? true : ['invalid.matchingpasswords']
}
}
}
然后将以下内容添加到messages.properties文件中
User.password.invalid.matchingpasswords=Passwords do not match
当调用user.save()或user.validate()时,这将自动触发
然后将以下内容添加到messages.properties文件中
User.password.invalid.matchingpasswords=Passwords do not match
当调用user.save()或user.validate()时,这将自动触发。我建议您为Grails使用安全插件,可能是Shiro或Spring security Core 在Spring Security Core的示例中,有一个更改密码的示例:
def updatePassword = {
String username = session['SPRING_SECURITY_LAST_USERNAME']
if (!username) {
flash.message = 'Sorry, an error has occurred'
redirect controller: 'login', action: 'auth'
return
}
String password = params.password
String newPassword = params.password_new
String newPassword2 = params.password_new_2
if (!password || !newPassword || !newPassword2 || newPassword != newPassword2) {
flash.message = 'Please enter your current password and a valid new password'
render view: 'passwordExpired', model: [username: session['SPRING_SECURITY_LAST_USERNAME']]
return
}
User user = User.findByUsername(username)
if (!passwordEncoder.isPasswordValid(user.password, password, null /*salt*/)) {
flash.message = 'Current password is incorrect'
render view: 'passwordExpired', model: [username: session['SPRING_SECURITY_LAST_USERNAME']]
return
}
if (passwordEncoder.isPasswordValid(user.password, newPassword, null /*salt*/)) {
flash.message = 'Please choose a different password from your current one'
render view: 'passwordExpired', model: [username: session['SPRING_SECURITY_LAST_USERNAME']]
return
}
user.password = newPassword
user.passwordExpired = false
user.save() // if you have password constraints check them here
redirect controller: 'login', action: 'auth'
}
我建议您使用Grails的安全插件,可能是Shiro或Spring security Core 在Spring Security Core的示例中,有一个更改密码的示例:
def updatePassword = {
String username = session['SPRING_SECURITY_LAST_USERNAME']
if (!username) {
flash.message = 'Sorry, an error has occurred'
redirect controller: 'login', action: 'auth'
return
}
String password = params.password
String newPassword = params.password_new
String newPassword2 = params.password_new_2
if (!password || !newPassword || !newPassword2 || newPassword != newPassword2) {
flash.message = 'Please enter your current password and a valid new password'
render view: 'passwordExpired', model: [username: session['SPRING_SECURITY_LAST_USERNAME']]
return
}
User user = User.findByUsername(username)
if (!passwordEncoder.isPasswordValid(user.password, password, null /*salt*/)) {
flash.message = 'Current password is incorrect'
render view: 'passwordExpired', model: [username: session['SPRING_SECURITY_LAST_USERNAME']]
return
}
if (passwordEncoder.isPasswordValid(user.password, newPassword, null /*salt*/)) {
flash.message = 'Please choose a different password from your current one'
render view: 'passwordExpired', model: [username: session['SPRING_SECURITY_LAST_USERNAME']]
return
}
user.password = newPassword
user.passwordExpired = false
user.save() // if you have password constraints check them here
redirect controller: 'login', action: 'auth'
}
感谢您的回复。所以我不需要使用命令对象进行验证?建议使用命令对象。您可以将此代码改编为假设我有用户域类和用户命令类。所以,当用户在网站上注册时,数据验证有两个步骤:UserCommand约束验证。用户域对象约束验证。如何将这两个类传递给控制器操作和视图?感谢您的响应。因此,我不需要使用命令对象进行验证?建议使用命令对象。您可以将此代码改编为假设我有用户域类和用户命令类。所以,当用户在网站上注册时,数据验证有两个步骤:UserCommand约束验证。用户域对象约束验证。如何将这两个类传递给控制器操作和视图?验证是可以的,我还将
密码
和密码确认
添加到,否则它们将被持久化。另一个选择是使用CommandObject进行验证。为什么要向瞬态添加密码?您应该存储密码。只是不是密码确认。出于安全原因,我会将密码生成的哈希保存在另一个字段中,例如passwordHash
。如何更安全?仅仅因为它不是一个普通名称?总之,我会使用三个字段:password
和passwordConfirm
进行验证,并使用passwordHash
保存生成的哈希。前两个应该只有一个请求可用,因此它们是暂时的。验证是可以的,我还将password
和passwordConfirm
添加到,否则它们将被持久化。另一个选择是使用CommandObject进行验证。为什么要向瞬态添加密码?您应该存储密码。只是不是密码确认。出于安全原因,我会将密码生成的哈希保存在另一个字段中,例如passwordHash
。如何更安全?仅仅因为它不是一个普通名称?总之,我会使用三个字段:password
和passwordConfirm
进行验证,并使用passwordHash
保存生成的哈希。前两个请求应该只有一个请求可用,因此它们是瞬态的。