在 Grails 中完成验证后,有没有办法操作 Domain 对象?
我必须在插入数据库之前对密码进行编码,但我只想在验证完成后才这样做。
谢谢。
您可以使用事件:
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 插件生成的用户类以查看示例。也许该插件符合您的要求,因此您不必重新实现此功能?
对我来说,您在 gorm 对象中验证的内容应该是您保存的内容。如果您想验证未编码的密码,那么我建议您创建一个对密码具有适当约束的命令对象并对其进行验证。如果命令对象通过验证,则对密码进行编码并将其添加到要插入/更新的 gorm 对象中。
这样,gorm 对象只会看到编码的密码,在这里你应该验证它不是空的(或者看起来像一个十六进制编码的密码)。
从事这项工作:
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)
}
}
要考虑的事情是您如何验证密码复杂性,它应该发生在控制器和域类之间的服务中,还是应该是自定义密码字段验证器。