Модификация домена Grails при сохранении - PullRequest
0 голосов
/ 14 ноября 2010

Допустим, у меня есть класс домена пользователя с полями 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 Я придумала следующее:

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 Ответ

1 голос
/ 14 ноября 2010

Использование событий GORM

В событиях сохранения или обновления вы можете создать хэш

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