在Grails中完成验证后,有没有办法操作Domain对象?
我必须在插入数据库之前对密码进行编码,但我想在验证完成后再进行编码。
感谢。
答案 0 :(得分:2)
您可以使用活动:
beforeInsert - Executed before an object is initially persisted to the database
beforeUpdate - Executed before an object is updated
http://grails.org/doc/latest/guide/GORM.html
您可以查看spring security插件生成的用户类以查看示例。也许该插件符合您的要求,因此您无需重新实现此功能?
答案 1 :(得分:2)
对我来说,你在gorm对象中验证的内容应该是你节省的。如果您要验证未编码的密码,我建议您创建一个command object,其中包含对密码的适当约束并对其进行验证。如果命令对象通过验证,请对密码进行编码并将其添加到要插入/更新的gorm对象中。
这样,gorm对象只能看到编码密码,在这里你应该只验证它不是空的(或看起来像十六进制编码的密码)。
答案 2 :(得分:0)
这份工作:
class User {
transient saltSource
transient springSecurityService
String password
static constraints = {
password blank: false
}
static mapping = {
password column: '`password`'
}
def beforeInsert() {
encodePassword()
}
def beforeUpdate() {
if (isDirty('password')) {
encodePassword()
}
}
protected void encodePassword() {
if (springSecurityService)
password = springSecurityService.encodePassword(password,saltSource.systemWideSalt)
}
}
要考虑的是如何验证密码复杂性,如果它发生在控制器和域类之间的中间服务中,或者它应该是自定义密码字段验证器。