代码之家  ›  专栏  ›  技术社区  ›  Josh K

保存时的Grails域修改

  •  0
  • Josh K  · 技术社区  · 14 年前

    假设我有一个带字段的用户域类 username password . 为了简单起见,我想将密码存储为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 回复  |  直到 14 年前
        1
  •  1
  •   Aaron Saunders    14 年前

    使用 GORM Events

    在保存或更新事件上,可以执行创建哈希

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