域约束不起作用

时间:2015-01-15 09:34:07

标签: grails constraints gorm

我在Grails上的域文件夹下有一个域类。

我有一个带有String username属性的简单User实体,我遇到了一些约束问题。

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只是一个例子,因为我不仅测试了尺寸,还测试了长度,最大值,最小值等。

1 个答案:

答案 0 :(得分:2)

我认为您正在尝试在密码字段中使用长度,大小,maxLenght,max,min 。但是由于你使用spring安全性,因为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

因此,如果您要验证密码字段,请验证手动接收的值,或使用命令对象验证您的值。

命令对象是在持久化之前验证值的更首选方法。 请参阅Grails documentation for validation

上的主题11.3