2012-07-02 2 views
11

После миграции из Grails 1.3.7 в 2.0.4 Я заметил проблему с одним из моих классов домена, где я использую свойства переходного процесса для обработки паролей.Непревзойденные свойства Grails при создании объекта

Мой класс домен выглядит следующим образом (упрощенно):

package test 

    class User { 
String email 
String password1 
String password2 
//ShiroUser shiroUser 

static constraints = { 
    email(email:true, nullable:false, unique:true) 
    password1(nullable:true,size:5..30, blank: false, validator: {password, obj -> 

     if(password==null && !obj.properties['id']){ 
      return ['no.password'] 
     } 
     else return true 
     }) 
    password2(nullable:true, blank: false, validator: {password, obj -> 
     def password1 = obj.properties['password1'] 

     if(password == null && !obj.properties['id']){ 
      return ['no.password'] 
     } 
     else{ 
      password == password1 ? true : ['invalid.matching.passwords'] 
     } 
     }) 

} 
static transients = ['password1','password2'] 
    } 

В 1.3.7 это используется для работы в моем Bootstrap:

def user1= new User (email: "[email protected]", password1: "123456", password2: "123456") 
    user1.save() 

Однако в Grails 2.0.x это приведет к по ошибке, указав, что пароль1 и пароль2 равны нулю. То же самое происходит и в моих контроллеров, если я пытаюсь сделать:

def user2= new User (params)// params include email,password1 and password2 

Для того, чтобы сделать его работу я должен сделать следующий обходной путь:

def user2= new User (params)// params include email,password1 and password2 
    user2.password1=params.password1 
    user2.password2=params.password2 
    user2.save() 

Это довольно некрасиво - и раздражает.

Может ли кто-нибудь сказать, что мое использование переходных процессов стало недействительным в grails 2.x, или если это может быть некорректной ошибкой структуры?

ответ

14

По соображениям безопасности переходные процессы более не связаны автоматически. Но вы можете легко заставить его работать, добавив «привязываемое» ограничение (см. http://grails.org/doc/latest/ref/Constraints/bindable.html). Изменение

password2(nullable:true, blank: false, validator: {password, obj -> 

в

password2(bindable: true, nullable:true, blank: false, validator: {password, obj -> 
+0

Спасибо, Burt - Имеет смысл с этим изменением, связанным с безопасностью. Просто не знал о (новом?) «Связующем» ограничении. –

+1

Эй, Берт, это изменилось в 2.1.0? У меня точно такой же сценарий, и для нас «cnfPassword» по-прежнему считается нулевым! Не хочу открывать новую тему для того же вопроса :) – Sap

+2

Привет, Берт, он не работает должным образом в грабелях 2.4.3. Есть ли альтернативное решение, которое вы можете посоветовать? – daimon

3

Я думаю, что часть улучшения связывания данных в grails 2.x - это не будет связывать переходные свойства.

+1

есть альтернативный способ сделать это тогда? – sttaq