grails - 域约束不起作用

标签 grails constraints grails-orm

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

我有一个带有字符串用户名属性的简单用户实体,但我遇到了一些约束问题。

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

唯一性、电子邮件和其他约束似乎工作正常,但其他一些约束,例如长度、大小、最大长度、最大、最小和验证器(自定义)似乎被简单地忽略了(!!)所以我能够节省违反这些约束的数据库对象。

知道可能是什么原因吗?

编辑:这些问题出在用户名字段上……与密码无关。

EDIT2:我意识到这个问题不会在 MySQL 数据库的生产模式下发生。它发生在使用 H2 的集成测试时间 (GroovyTestCase)(至少)

EDIT3:添加完整的实体代码顺便说一句,这只是一个示例,因为我不仅测试了大小,还测试了长度、最大值、最小值等。

最佳答案

我认为您正在尝试在密码字段上使用length, size, maxLenght, max, min。但是由于您使用的是 spring security,因此由于 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

关于grails - 域约束不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27960414/

相关文章:

grails - Grails应用程序不会热交换更改

java - Grails 2.4.2 域不会保存超过 8 个字段

ios - Xcode 6 和约束 - 变灰的等宽选项

grails - 保存新的域对象会导致立即刷新

database - 是否可以在 Grails 应用程序中为非 PK 字段使用数据库序列?

hibernate - Grails Hibernate 版本升级

grails - 如何在Grails 3中更改应用程序名称?

ios - View 连接到安全区域边缘顶部而不是 super View ,我将如何连接到 super View 顶部?

iOS - 设置两个 subview 约束的更好方法

grails hasOne vs 直接成员变量