【问题标题】:Securing JSON-PATCH paths in Spring Boot Data Rest application在 Spring Boot Data Rest 应用程序中保护 JSON-PATCH 路径
【发布时间】:2017-03-03 23:17:48
【问题描述】:

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

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

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

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

从而改变文章的标题!!

显然这不好。

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

那么...我如何在 Spring 中实现这一点?

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

谢谢!

【问题讨论】:

    标签: java spring spring-mvc json-patch


    【解决方案1】:

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

    考虑以下选项:

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

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

    【讨论】:

    • 到目前为止,我已经实现了一个自定义方法来处理带有 application/json-patch+json 内容类型的 PATCH。这行得通。
    • 我不熟悉 Spring 对 json-merge PATCH 的支持。会看的。
    • 关联没有级联,但更改肯定会持续存在。我不认为它是通过级联机制实现的——实际上级联概念甚至不适用于这里。这是通过 SpEL 在对象图中的纯路径导航,对图的更改从 Session 持久化到 DB。
    • 很高兴知道,谢谢。我建议向 spring-data-rest 项目添加一个问题。如果您可以共享自己的补丁 impl(如果适用),那也很棒。顺便说一句,我们以禁用 json-patch 并在我们的项目中仅使用 json-merge 结束。
    猜你喜欢
    • 2017-08-09
    • 2015-05-12
    • 2016-07-30
    • 2015-11-30
    • 2014-03-28
    • 2018-10-28
    • 2018-07-31
    • 2020-05-29
    • 1970-01-01
    相关资源
    最近更新 更多