11

我正在使用一个漂亮的普通spring-boot-starter-data-rest设置并启用了该PATCH方法。一切正常,但我有一个安全问题,想知道缓解它的推荐方法是什么。

问题是PATCH paths 允许从不同的端点更新可达实体。所以,假设我有一个comments端点和一个article端点。每条评论与其文章都有一对一的关联。有权编辑评论的用户可以执行以下操作:

PATCH http://some.domain.foo/api/comments/1234
Content-Type: application/json-patch+json

[
    { "op": "replace", "path": "/article/title", "value": "foobar2" }
]

从而更改文章的标题!

显然这不好。

在这种情况下,对于 API 的其他部分,与“文章”的关联需要是可遍历的。但它必须是只读的。

那么......我如何在春天完成这个?

拦截请求?实现处理程序方法?从头开始编写我自己的控制器?

谢谢!

4

1 回答 1

5

似乎 spring-data-rest 上的当前实现将路径转换为 ​​SpEL 以直接在 bean 上应用值。请参阅PatchOperation (v2.5.x)

考虑以下选项:

  • 代替 json-patch 使用json-merge PATCH 请求来发送部分更新(使用“application/json”或“application/merge-patch+json”内容类型)。这将尊重@JsonIgnore和其他杰克逊注释,也将区别对待关联。
  • 您可以完全禁用“json-patch+json”,例如通过添加安全过滤器
  • 如果您仍然需要它,您可以随时创建您的自定义 json-patch 实现
  • 使用不依赖 JPA 的应用程序级连接,即仅公开链接实体的 ID 并在您的ResourceProcessor.

此外,如果您使用的是 JPA 并Comment.article带有注释,请@ManyToOne确保没有级联关联。即使文章对象被补丁修改,它也不会与评论一起保存。

于 2017-03-16T10:03:07.747 回答