保存时Grails域修改

时间:2010-11-14 00:11:15

标签: security validation grails passwords grails-domain-class

假设我有一个包含字段usernamepassword的用户域类。为简单起见,我想将密码存储为SHA-512哈希。我还想在对密码进行哈希处理之前验证密码,但在保存之前也要透明地对密码进行哈希处理。有没有办法在域对象中执行此操作?

static constraints = 
{
    username(blank: false, unique: true);
    password(minSize: 10);
}

而不是说:

def user = new User(username: "joe", password: createHash("joepass"));

我无法验证哈希

def user = new User(username: "joe", password: "joepass");
if(user.validate())
{
    user.save(); // Would then turn password into a hash on save
}
else
{
    // Handle validation errors
}

关注GORM Events我想出了以下内容:

def beforeInsert = { doHash(); }
def beforeUpdate = { doHash(); }
void doHash()
{
    if(this.password.size() != 32)
    {
        this.password = this.password.encodeAsHash(); // I wrote a codec for this
    }
}

现在,在创建新用户时,此功能正常。但是,如果我创建一个用户,给他们一个密码并保存它们,然后更改密码并重新保存,这些方法都不会被调用,并且会存储普通的测试密码。

1 个答案:

答案 0 :(得分:1)

使用GORM Events

在保存或更新事件上,您可以执行create hash

   def beforeInsert = {
       // do hash magic
   }
   def beforeUpdate = {
        // do hash magic
   }