Spring data rest - 有没有办法限制支持的操作?

Posted

技术标签:

【中文标题】Spring data rest - 有没有办法限制支持的操作?【英文标题】:Spring data rest - Is there a way to restrict the supported operations? 【发布时间】:2017-07-19 07:03:12 【问题描述】:

我想在 Spring(SpringBoot) 应用程序中将数据库中的数据作为 Restful API 公开。 Spring Data Rest 似乎完全适合此活动的目的。

这个数据库对于我的应用程序需要是只读的。默认提供所有 HTTP 方法。有没有我可以用来限制(实际上是防止)其他方法被暴露的配置?

【问题讨论】:

最方便的方法是使用 Spring 安全性来阻止除 GET 请求之外的所有内容。 SDR 确实提供了这方面的功能:docs.spring.io/spring-data/rest/docs/current/reference/html/… 但是通过 Spring Security 在 HTTP 级别进行处理更简单。 【参考方案1】:

来自 Hiding repository CRUD methods 上的 Spring 文档:

16.2.3。隐藏存储库 CRUD 方法

如果您不想在您的 CrudRepository,你可以使用@RestResource(exported = false) 通过覆盖您要关闭的方法并放置 覆盖版本上的注释。例如,为了防止 HTTP 用户从调用 CrudRepository 的删除方法,覆盖所有 并将注解添加到被覆盖的方法中。

@RepositoryRestResource(path = "people", rel = "people")
interface PersonRepository extends CrudRepository<Person, Long> 

  @Override
  @RestResource(exported = false)
  void delete(Long id);

  @Override
  @RestResource(exported = false)
  void delete(Person entity);

作为导出器覆盖这两个删除方法很重要 目前使用一种有点幼稚的算法来确定哪个 CRUD 为了更快的运行时性能而使用的方法。它不是 目前可以关闭带有 ID 的删除版本 但保留导出采用实体实例的版本。为了 暂时,您可以导出删除方法,也可以不导出。如果你 想要关闭它们,然后请记住,您必须同时注释两者 导出 = false 的版本。

【讨论】:

如果你正在阅读这篇文章,你应该考虑投票给这张票。 SDR 可能很危险。 jira.spring.io/browse/DATAREST-1034 sping boot 2.0.2.RELEASE 仍然如此吗? 我正在使用 JpaRepository。当我尝试覆盖 void delete(Long id);我收到一条错误消息,“方法不会覆盖其超类中的方法”。我该怎么办? 对我不起作用...启动,数据休息 1.5.4 发布。 查看@Snekse 答案并使用RepositoryRestConfiguration.disableDefaultExposure() 及其文档仅导出明确标记的存储库/方法。【参考方案2】:

截至 2018 年初,现在有 ability to only expose repository methods explicitly declared for exposure (DATAREST-1176)

见RepositoryRestConfiguration

Export false at Type level does not allow overriding with export true at Method level 票证 (DATAREST-1034) 已打开,但作为 DATAREST-1176 的副本关闭。奥利弗·吉尔克说:

我将根据 DATAREST-1176 的版本解决此问题 现在,但如果还有其他需要,请随时重新打开。

它们不是完全重复的,1034 中描述的功能会更加用户友好,但现在至少有一些选项。

【讨论】:

你能解释一下这是怎么可能的吗?我在任何地方都找不到它。 @HamidMohayeji 这可能无法完全回答您的问题,但ExposureConfiguration 可能是最正确的配置方式。 自定义默认曝光 docs.spring.io/spring-data/rest/docs/current/reference/html/… * ExposureConfiguration* docs.spring.io/spring-data/rest/docs/current/api/org/… @HamidMohayeji 如果上述评论失败,那么获取RepositoryRestConfiguration 的句柄并设置repositoryDetectionStrategy 可能是一种选择。您可以搜索该类以了解 expose 的用法,以及更改默认曝光的几个选项。可能有 spring boot 属性来调整这些东西。 如果你想使用JpaRepository,它还能用吗? @nikiforos 有一种方法可以找出答案?

以上是关于Spring data rest - 有没有办法限制支持的操作?的主要内容,如果未能解决你的问题,请参考以下文章

使用 spring-data-rest 将资源添加到集合

Spring Data Rest - 软删除

是否有适用于 JPA、spring-data、spring-data-rest 的通用 REST 查询语言

Spring Data REST CORS - 如何处理预检选项请求?

Spring-Data-Rest 验证器

排除 Spring-data-rest 资源的部分字段