【问题标题】:Domain constraints not working域约束不起作用
【发布时间】:2015-03-13 16:01:59
【问题描述】:

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

unique、email 等约束似乎可以正常工作,但长度、大小、maxLength、max、min 和验证器(自定义)等其他一些约束似乎被简单地忽略了(!!)所以我可以节省违反这些约束的数据库对象。

知道可能是什么原因吗?

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

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

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

【问题讨论】:

  • 不是问题的答案,但对于必须是电子邮件地址的东西来说,最大长度 20 似乎相当短。

标签: grails constraints grails-orm


【解决方案1】:

我认为您正在尝试在密码字段上使用 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

【讨论】:

  • 感谢您的回答,但事实并非如此......我将这些约束与用户名字段一起使用,而不是密码。我会澄清这个问题。
  • 您能否发布完整的代码以及不起作用的约束?这将有助于发现问题。还要重新运行代码并复制粘贴堆栈跟踪中的任何错误/警告(如果有)。
  • 根本没有错误...对象被保存,就好像约束不存在一样。我真的很烦! ...我将在文档中添加额外的代码。
猜你喜欢
  • 1970-01-01
  • 2018-11-30
  • 2018-12-30
  • 2017-08-24
  • 2014-11-20
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多