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