2012-07-02 10 views
11

Dopo la migrazione da Grails 1.3.7 a 2.0.4 ho notato un problema con una delle mie classi di dominio in cui utilizzo le proprietà transitori per gestire le password.Proprietà transitori Grails non rilevate nella creazione dell'oggetto

La mia classe di dominio si presenta così (semplificato):

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'] 
    } 

In 1.3.7 Ciò usata per funzionare nel mio Bootstrap:

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

Tuttavia, in Grails 2.0.x questo si tradurrà in errore affermando che password1 e password2 sono entrambi nulli. La stessa cosa accade nel mio controller se cerco di fare:

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

Al fine di farlo funzionare devo fare la seguente soluzione:

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

questo è abbastanza brutto - e fastidioso.

Qualcuno può dire se il mio utilizzo dei transitori non è più valido in Grails 2.x, o se questo potrebbe essere un bug di qualche tipo?

risposta

14

Per motivi di sicurezza, i transienti non vengono più associati automaticamente. Ma puoi facilmente farlo funzionare aggiungendo un vincolo 'legabile' (vedi http://grails.org/doc/latest/ref/Constraints/bindable.html). Cambiare

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

a

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

Grazie Burt: ha un buon senso con questo cambiamento legato alla sicurezza. Semplicemente non ero a conoscenza del (nuovo?) Vincolo 'legabile'. –

+1

Hey Burt, è cambiato in 2.1.0? Ho lo stesso identico scenario e per noi "cnfPassword" viene ancora come null! Non voglio aprire una nuova discussione per la stessa domanda :) – Sap

+2

Ciao Burt, non funziona correttamente in Grails 2.4.3. C'è qualche soluzione alternativa che puoi consigliare? – daimon

3

Penso che come parte del miglioramento del binding dei dati in Grails 2.x - non legherà le proprietà transitorie.

+1

c'è un modo alternativo per fare questo allora? – sttaq

Problemi correlati