2017-03-03 93 views
11

我使用漂亮的香草spring-boot-starter-data-rest安装并启用了PATCH方法。所有工作,但我有一个安全问题,并想知道什么是减轻它的推荐方法。在Spring Boot Data Rest应用程序中保护JSON-PATCH路径

问题是,PATCHpath s允许从不同端点更新可到达的实体。所以,假设我有一个comments端点和一个article端点。每条评论与其文章都有一对一的关联。有权编辑评论的用户可以这样做:

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

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

从而改变文章的标题!

显然这不好。

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

那么......我在春季怎么做到这一点?

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

谢谢!

回答

5

似乎Spring-data-rest上的当前实现将路径转换为SpEL以直接在Bean上应用值。见PatchOperation (v2.5.x)

考虑以下选项:

  • 相反JSON的贴剂的使用JSON-合并 PATCH请求发送部分更新(用 “应用/ JSON” 或 “应用程序/合并贴片+ JSON” 内容类型)。这将尊重@JsonIgnore和其他杰克逊注释,并且也会以不同的方式处理关联。
  • 您可以禁用“JSON-补丁+ JSON”完全,例如通过增加安全过滤
  • 你总是可以创建自定义的JSON-补丁实现,如果你仍然需要它
  • 使用应用程序级加入不依赖于JPA,即只暴露链接实体的ID并在您的ResourceProcessor中提供自定义链接。

此外,如果你使用JPA和Comment.article标注有@ManyToOne确保有结社没有级联。即使文章对象是使用补丁修改的,它也不会与评论一起保存。

+0

到目前为止,我已经提前实现了一个自定义方法来处理应用程序/ json-patch + json内容类型的PATCH。那是有效的。 – sofend

+0

我不熟悉Spring对JSON合并PATCH的支持。将看看那个。 – sofend

+0

关联中没有级联,但更改肯定会持续存在。我不认为它是通过级联机制 - 事实上,级联概念甚至不适用于此。这是通过SpEL在对象图中进行的纯路径导航,对图的更改从会话持续到数据库。 – sofend

相关问题