保护Spring Boot Data Rest应用程序中的JSON-PATCH路径

sof*_*end 11 java spring spring-mvc json-patch

我正在使用漂亮的vanilla 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" }
]
Run Code Online (Sandbox Code Playgroud)

从而改变文章的标题!!

显然这不好.

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

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

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

谢谢!

aux*_*aux 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确保关联时没有级联.即使使用补丁修改了文章对象,它也不会与评论一起保存.