在 Spring Boot Data Rest 应用程序中保护 JSON-PATCH 路径
Securing JSON-PATCH paths in Spring Boot Data Rest application
我使用的是非常普通的 spring-boot-starter-data-rest
设置并启用了 PATCH
方法。一切正常,但我有一个安全问题,想知道缓解它的推荐方法是什么。
问题是 PATCH
path
s 允许从不同端点更新可达实体。所以,假设我有一个 comments
端点和一个 article
端点。每条评论与其文章都有 to-one 关联。有权编辑评论的用户可以执行如下操作:
PATCH http://some.domain.foo/api/comments/1234
Content-Type: application/json-patch+json
[
{ "op": "replace", "path": "/article/title", "value": "foobar2" }
]
从而改变文章的标题!!
显然这不好。
在这种情况下,对于 API 的其他部分,与 "article" 的关联需要是可遍历的。但必须是read-only.
那么...我如何在 Spring 中完成此操作?
拦截请求?
实现处理程序方法?
从头开始编写我自己的控制器?
谢谢!
似乎 spring-data-rest 上的当前实现将路径转换为 SpEL 以直接在 bean 上应用值。参见 PatchOperation (v2.5.x)。
考虑这些选项:
- 代替json-patch使用json-merge PATCH请求发送部分更新(使用"application/json"或"application/merge-patch+json" 内容类型)。这将尊重
@JsonIgnore
和其他 Jackson 注释,并以不同方式对待关联。
- 您可以完全禁用"json-patch+json",例如通过添加安全过滤器
- 如果您仍然需要,您可以随时创建自定义 json 补丁实施
- 使用不依赖于 JPA 的应用程序级连接,即仅公开链接实体的 ID 并在您的
ResourceProcessor
中提供自定义链接。
此外,如果您使用的是 JPA 并且 Comment.article
带有 @ManyToOne
注释,请确保关联没有级联。文章对象即使打了补丁也不会和评论一起保存
我使用的是非常普通的 spring-boot-starter-data-rest
设置并启用了 PATCH
方法。一切正常,但我有一个安全问题,想知道缓解它的推荐方法是什么。
问题是 PATCH
path
s 允许从不同端点更新可达实体。所以,假设我有一个 comments
端点和一个 article
端点。每条评论与其文章都有 to-one 关联。有权编辑评论的用户可以执行如下操作:
PATCH http://some.domain.foo/api/comments/1234
Content-Type: application/json-patch+json
[
{ "op": "replace", "path": "/article/title", "value": "foobar2" }
]
从而改变文章的标题!!
显然这不好。
在这种情况下,对于 API 的其他部分,与 "article" 的关联需要是可遍历的。但必须是read-only.
那么...我如何在 Spring 中完成此操作?
拦截请求? 实现处理程序方法? 从头开始编写我自己的控制器?
谢谢!
似乎 spring-data-rest 上的当前实现将路径转换为 SpEL 以直接在 bean 上应用值。参见 PatchOperation (v2.5.x)。
考虑这些选项:
- 代替json-patch使用json-merge PATCH请求发送部分更新(使用"application/json"或"application/merge-patch+json" 内容类型)。这将尊重
@JsonIgnore
和其他 Jackson 注释,并以不同方式对待关联。 - 您可以完全禁用"json-patch+json",例如通过添加安全过滤器
- 如果您仍然需要,您可以随时创建自定义 json 补丁实施
- 使用不依赖于 JPA 的应用程序级连接,即仅公开链接实体的 ID 并在您的
ResourceProcessor
中提供自定义链接。
此外,如果您使用的是 JPA 并且 Comment.article
带有 @ManyToOne
注释,请确保关联没有级联。文章对象即使打了补丁也不会和评论一起保存