如何在使用域模型作为命令对象时限制绑定的属性

时间:2014-03-31 19:49:30

标签: grails

Grails这个非常强大的功能

def save(MyDomain model) {
  model.save()
  render ''
}

将解析请求正文或参数,运行MyDomain.get(id),填写请求正文中的属性或参数并保存。对于这一小段代码来说,这是很多。

如何限制绑定到model的属性?假设我有accountBalance属性是只读的,我不希望恶意用户能够更改其帐户余额。

此外,我希望有多个操作可以保存MyDomain的不同属性子集......例如,一个操作可能是为帐户持有人存款的银行出纳员用户。在这种情况下,出纳员应该能够设置accountBalance但不能设置password

我意识到实际的银行应用程序不会像这样工作,这只是一个例子。

我还有其他问题导致我使用命令对象绑定数据(参见Grails fails to parse request when content type is specified during post)。任何解决方案也必须解决该帖子。我想如果解决方案使用命令对象然后它会工作,但如果命令对象不在解决方案中,那么必须解决请求体问题。

2 个答案:

答案 0 :(得分:2)

没有尝试过实际的域类,但是你可以尝试使用bindData而不是隐式绑定,你可以特别指定要排除的属性吗?

def save() {
  //params - A Map of source parameters
  //It can be params or any other representation of request body
  //request.JSON, request.XML

  MyDomain model = MyDomain.get(params.id?.toLong())

  bindData(model, params, [exclude: ['accountBalance']])

  model.save()
  render ''
}    

答案 1 :(得分:0)

我建议你看一下关于绑定的documentation。有很多信息,特别是关于安全性的部分,与您的关注点类似。查看事实bindData()允许您包含/排除属性,您应该能够编写所需的任何绑定变体。