2013-11-14 4 views

ответ

3
class User { 

    String password 
    String passwordConfirm 


    static constraints = { 
    password blank: false, nullable: false, minSize: 8, maxSize: 64, validator: {password, obj -> 
     def password2 = obj.passwordConfirm 
     password2 == password ? true : ['invalid.matchingpasswords'] 
    } 
    } 

} 

Затем добавьте следующую строку в файл messages.properties ...

User.password.invalid.matchingpasswords=Passwords do not match 

Когда user.save() или user.validate() вызывается, это вызовет автоматически.

+0

проверки в порядке, и я также добавить '' password' и passwordConfirm' в [переходных] (Http: // Граалей .org/doc/latest/ref/Domain% 20Classes/transients.html), в противном случае они будут сохранены. Другой вариант - использовать CommandObject для проверки. –

+0

Зачем вам добавлять пароль для переходных процессов? Вы должны хранить пароль. Только не passwordConfirm. – Gregg

+0

Из соображений безопасности я сохранил бы хэш, сгенерированный паролем, в другом поле, например 'passwordHash'. –

1

Предлагаю вам использовать плагин безопасности для Grails, возможно, Shiro или Spring Security Core.

documentation В Спринг безопасности Ядра есть пример изменения пароля:

def updatePassword = { 
    String username = session['SPRING_SECURITY_LAST_USERNAME'] 
    if (!username) { 
     flash.message = 'Sorry, an error has occurred' 
     redirect controller: 'login', action: 'auth' 
     return 
    } 
    String password = params.password 
    String newPassword = params.password_new 
    String newPassword2 = params.password_new_2 
    if (!password || !newPassword || !newPassword2 || newPassword != newPassword2) { 
     flash.message = 'Please enter your current password and a valid new password' 
     render view: 'passwordExpired', model: [username: session['SPRING_SECURITY_LAST_USERNAME']] 
     return 
    } 

    User user = User.findByUsername(username) 
    if (!passwordEncoder.isPasswordValid(user.password, password, null /*salt*/)) { 
     flash.message = 'Current password is incorrect' 
     render view: 'passwordExpired', model: [username: session['SPRING_SECURITY_LAST_USERNAME']] 
     return 
    } 

    if (passwordEncoder.isPasswordValid(user.password, newPassword, null /*salt*/)) { 
     flash.message = 'Please choose a different password from your current one' 
     render view: 'passwordExpired', model: [username: session['SPRING_SECURITY_LAST_USERNAME']] 
     return 
    } 

    user.password = newPassword 
    user.passwordExpired = false 
    user.save() // if you have password constraints check them here 

    redirect controller: 'login', action: 'auth' 
} 
+0

Спасибо за ваш ответ. Мне не нужно использовать объект команды для проверки? – user2985824

+0

Рекомендуется использовать объект команды. Вы можете адаптировать этот код к [валидатору] (http://grails.org/doc/latest/ref/Constraints/validator.html) –

+0

Предположим, у меня есть класс домена пользователя и класс UserCommand. Итак, когда пользователь регистрируется на веб-сайте, есть два шага для проверки данных: Проверка ограничений UserCommand. Объект пользовательского домена сдерживает проверку. Как я могу передать оба этих класса в действие и просмотр контроллера? – user2985824

Смежные вопросы