2015-01-15 2 views
3

У меня есть класс домена под папкой домена на Grails.Ограничения домена не работают

У меня есть простой пользовательский объект с атрибутом имени String, и у меня возникают проблемы с некоторыми ограничениями.

class User { 

    transient springSecurityService 

    String username 
    String password 
    boolean enabled = true 
    boolean accountExpired 
    boolean accountLocked 
    boolean passwordExpired 

    static transients = ['springSecurityService'] 

    static constraints = { 
     username blank: false, unique: true, email: true, size: 4..20 
     password blank: false 
    } 

    static mapping = { 
     password column: '`password`' 
    } 

    Set<Role> getAuthorities() { 
     UserRole.findAllByUser(this).collect { 
      it.role 
     } 
    } 

    def beforeInsert() { 
     encodePassword() 
    } 

    def beforeUpdate() { 
     if (isDirty('password')) { 
      encodePassword() 
     } 
    } 

    protected void encodePassword() { 
     password = springSecurityService?.passwordEncoder ? springSecurityService.encodePassword(password) : password 
    } 
} 

Ограничения, как уникальный, адрес электронной почты, и другие, кажется, правильно работать, но некоторые другие, как длина, размер, MAXLENGTH, макс, мин, и валидатор (под заказ), кажется, просто игнорируются (!!), поэтому я способный сохранять объекты базы данных, которые нарушают эти ограничения.

Любая идея, в чем причина?

РЕДАКТИРОВАТЬ: Эти проблемы находятся в поле имени пользователя ... без привязки пароля.

EDIT2: Я понял, что проблема не возникает в режиме производства с базой данных MySQL. Это происходит во время тестирования интеграции (GroovyTestCase) с использованием H2 (по крайней мере)

EDIT3: Добавить полный код объекта BTW - это только пример, так как я тестировал не только размер, но и длину, макс, мин и другие ,

+0

Не ответ на вопрос, но максимальная длина 20 кажется довольно короткой для того, что должно быть адресом электронной почты. –

ответ

2

Я думаю, вы пытаетесь использовать длина, размер, maxLenght, max, min в поле пароля. Но так как вы используете весеннюю безопасность, поэтому из-за алгоритма хэширования BCrypt каждый раз генерируется другое значение хэша длиной 60.

ПРИМЕР-

$2a$10$EblZqNptyYvcLm/VwDCVAuBjzZOI7khzdyGPBr08PpIi0na624b8. 
$2a$10$trT3.R/Nfey62eczbKEnueTcIbJXW.u1ffAo/XfyLpofwNDbEB86O 
$2a$10$teJrCEnsxNT49ZpXU7n22O27aCGbVYYe/RG6/XxdWPJbOLZubLIi2 
$2a$10$BHG59UT6p7bgT6U2fQ/9wOyTIdejh4Rk1vWilvl4b6ysNPdhnViUS 
$2a$10$W9oRWeFmOT0bByL5fmAceucetmEYFg2yzq3e50mcu.CO7rUDb/poG 

Так что, если вы хотите, чтобы подтвердить ваше поле пароля либо подтвердить значение, полученное вручную или с помощью командной строки объект, чтобы проверить свои значения.

Командные объекты являются более предпочтительным способом проверки значений перед их сохранением. Обратитесь к теме 11.3 на странице Grails documentation for validation

+0

Спасибо за ответ, но это не так ... Я использую эти ограничения с полем имени пользователя, а не с паролем. Я уточню этот вопрос. – Rafael

+1

Не могли бы вы разместить полный код вместе с ограничениями, которые не работали? Это поможет найти проблему. Также повторно запустите код и скопируйте все ошибки/предупреждения в стеке (если есть). – Chetan

+0

Ошибок нет ... объекты сохраняются, как будто ограничение не существует. Ir действительно раздражает! ... я добавлю дополнительный код в документ. – Rafael

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