我将 Grails 3.3.2 与 mongoDB 插件 (v6.1.4) 和 Spring Security Core 插件 (v3.2.0) 一起使用。
我有UserPasswordEncoderListener
以下persistenceEvent方法:
@Override
protected void onPersistenceEvent(AbstractPersistenceEvent event) {
if (event.entityObject instanceof User) {
User u = (event.entityObject as User)
if (u.password && (event.eventType == EventType.PreInsert || (event.eventType == EventType.PreUpdate && u.hasChanged('password')))) {
event.getEntityAccess().setProperty("password", encodePassword(u.password))
}
}
}
问题是hasChanged
每次我保存一个没有更新的用户对象时调用总是返回true,导致已经编码的密码被重新编码,从而破坏了身份验证。
一种解决方法是使用旧方法,只需从数据库中检索原始密码并在编码之前进行比较,但我想知道为什么hasChanged
错误地返回 true。
我hasChanged
通过在 groovy 控制台中运行以下命令测试了它在其他地方的行为是否正确:
def user = User.findByEmail("user@email.com")
println "Result: "+ user.hasChanged('password')
结果是Result: false
。为什么它在持久性侦听器类中不起作用?
仅供参考:我在 resources.groovy 中定义了以下 bean:
userPasswordEncoderListener(UserPasswordEncoderListener,ref('mongoDatastore'))