Grails 漏洞?更新操作忽略拒绝值

Posted

技术标签:

【中文标题】Grails 漏洞?更新操作忽略拒绝值【英文标题】:Grails bug? Update action ignores rejectValue 【发布时间】:2012-08-12 21:05:44 【问题描述】:

我在 Grails 控制器中的更新操作遇到问题。

当我提交更改密码(或其确认)的表单时,我希望对其进行验证,如果没有得到很好的确认,我应该拒绝该表单并警告用户。我正在尝试遵循 Grails 文档说明(http://grails.org/doc/latest/ref/Domain%20Classes/errors.html)。

当我只更改密码或其确认时,一切正常。

但是当我更改表单中的密码时出现问题,即使验证密码的块显然执行得很好,对象(userInstance)仍然会更新。而且,不仅其他数据被持久化,而且是“错误确认”的密码。

我尝试在下面的示例代码中插入一些“printlns”来说明会发生什么。我正在使用 Grails 2.0.0 并在 IntelliJ 11.1.3 中进行调试(如果有帮助的话)。

我希望已经足够清楚了。

感谢您的任何回答。

def update() 
   ...

   if (params.password != params.confirmPassword) 
      println("This message is correctly printed when passwords differ.")
      userInstance.errors.rejectValue('password',
                                      'defaut.password.diff.message',
                                      'Password confirmation is incorrect!')
      render(view: "edit", model: [userInstance: userInstance])
      return
   

   println("This message is correctly NOT printed when passwords differ.")
   println("But 'userInstance' object is updated in DB anyways. :( ")

   if (!userInstance.save(flush: true)) 
      render(view: "edit", model: [userInstance: userInstance])
      return
   

   flash.message = message(code: 'default.updated.message', args: [message(code: 'utilisateur.label', default: 'Utilisateur'), utilisateurInstance.id])
   redirect(action: "show", id: utilisateurInstance.id)

【问题讨论】:

【参考方案1】:

我认为您的userInstance 已保存,因为成功操作后会自动刷新。如果密码不匹配,请尝试在返回语句之前使用userInstance.discard()。这样你就可以从 Hibernate 中分离这个实例,并且它不会在操作后被保存。

【讨论】:

谢谢托马斯!就是这样。

以上是关于Grails 漏洞?更新操作忽略拒绝值的主要内容,如果未能解决你的问题,请参考以下文章

Grails,Field 的域类默认值

Grails投影忽略MongoDB的排序顺序

如何在 Grails 中显示异常?

Grails + Acegi:如何处理密码更新?登录用户与未登录用户

访问被拒绝并获取 抱歉,在 grails 中将插件 Spring Security 核心升级到 2.0 版本后,您无权查看此页面

grails/mysql 时区更改