有没有办法在Grails中完成验证后操作Domain对象

时间:2012-07-02 18:46:34

标签: grails gorm

在Grails中完成验证后,有没有办法操作Domain对象?

我必须在插入数据库之前对密码进行编码,但我想在验证完成后再进行编码。

感谢。

3 个答案:

答案 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)
  }

}

要考虑的是如何验证密码复杂性,如果它发生在控制器和域类之间的中间服务中,或者它应该是自定义密码字段验证器。