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