Spring认证中国教育管理中心-Spring Data REST框架教程二

本文档详细介绍了Spring Data REST框架中馆藏资源、物品资源、协会资源、搜索资源和查询方法资源对HTTP方法的支持,包括GET、POST、PUT、PATCH和DELETE。内容涵盖了方法的使用、自定义状态代码、媒体类型以及相关资源。此外,还讨论了分页和排序功能。

原标题:Spring认证中国教育管理中心-Spring Data REST框架教程二(Spring中国教育管理中心

4.2.馆藏资源

Spring Data REST 公开了一个以导出存储库正在处理的域类的非大写复数版本命名的集合资源。资源的名称和路径都可以通过@RepositoryRestResource在存储库界面上使用来自定义。

4.2.1.支持的 HTTP 方法

集合资源同时支持GET和POST. 所有其他 HTTP 方法都会导致405 Method Not Allowed.

GET

通过其findAll(…)方法返回存储库服务器的所有实体。如果存储库是分页存储库,我们会在必要时包含分页链接和其他页面元数据。

用于调用的方法

如果存在,则使用以下方法(降序):

  • findAll(Pageable)
  • findAll(Sort)
  • findAll()

有关方法默认公开的更多信息,请参阅存储库方法公开。

参数

如果存储库具有分页功能,则资源采用以下参数:

  • page: 要访问的页码(0 索引,默认为 0)。
  • size:请求的页面大小(默认为 20)。
  • sort: 格式为($propertyname,)+[asc|desc]?的排序指令的集合。

自定义状态代码

该GET方法只有一个自定义状态代码:

  • 405 Method Not Allowed:如果findAll(…)方法未导出(通过@RestResource(exported = false))或不存在于存储库中。

支持的媒体类型

该GET方法支持以下媒体类型:

  • application/hal+json
  • application/json

相关资源

该GET方法支持用于发现相关资源的单个链接:

  • search:如果后备存储库公开查询方法,则公开搜索资源。

HEAD

该HEAD方法返回集合资源是否可用。它没有状态代码、媒体类型或相关资源。

用于调用的方法

如果存在,则使用以下方法(降序):

  • findAll(Pageable)
  • findAll(Sort)
  • findAll()

有关方法默认公开的更多信息,请参阅存储库方法公开。

POST

该POST方法从给定的请求正文创建一个新实体。默认情况下,响应是否包含正文由Accept随请求发送的标头控制。如果发送了一个,则会创建一个响应正文。如果不是,则响应正文为空,并且可以通过以下Location响应标头中包含的链接获取所创建资源的表示。可以通过相应的配置来覆盖此行为
RepositoryRestConfiguration.setReturnBodyOnCreate(…)。

用于调用的方法

如果存在,则使用以下方法(降序):

  • save(…)

有关方法默认公开的更多信息,请参阅存储库方法公开。

自定义状态代码

该POST方法只有一个自定义状态代码:

  • 405 Method Not Allowed:如果save(…)方法未导出(通过@RestResource(exported = false))或根本不存在于存储库中。

支持的媒体类型

该POST方法支持以下媒体类型:

  • 应用程序/hal+json
  • 应用程序/json

4.3.物品资源

Spring Data REST 将单个集合项的资源公开为集合资源的子资源。

4.3.1.支持的 HTTP 方法

项目资源通常支持GET、PUT、PATCH和DELETE,除非显式配置阻止(请参阅“关联资源”了解详细信息)。

得到

该GET方法返回单个实体。

用于调用的方法

如果存在,则使用以下方法(降序):

  • findById(…)

有关方法默认公开的更多信息,请参阅存储库方法公开。

自定义状态代码

该GET方法只有一个自定义状态代码:

  • 405 Method Not Allowed:如果findOne(…)方法未导出(通过@RestResource(exported = false))或不存在于存储库中。

支持的媒体类型

该GET方法支持以下媒体类型:

  • 应用程序/hal+json
  • 应用程序/json

相关资源

对于域类型的每个关联,我们公开以关联属性命名的链接。您可以通过@RestResource在属性上使用来自定义此行为。相关资源为关联资源类型。

HEAD

该HEAD方法返回项目资源是否可用。它没有状态代码、媒体类型或相关资源。

用于调用的方法

如果存在,则使用以下方法(降序):

  • findById(…)

有关方法默认公开的更多信息,请参阅存储库方法公开。

PUT

该PUT方法用提供的请求正文替换目标资源的状态。默认情况下,响应是否包含正文由Accept随请求发送的标头控制。如果请求标头存在,200 OK则返回响应正文和状态代码。如果不存在标头,则响应正文为空,并且成功的请求将返回 状态204 No Content。可以通过相应的配置来覆盖此行为
RepositoryRestConfiguration.setReturnBodyOnUpdate(…)。

用于调用的方法

如果存在,则使用以下方法(降序):

  • save(…)

有关方法默认公开的更多信息,请参阅存储库方法公开。

自定义状态代码

该PUT方法只有一个自定义状态代码:

  • 405 Method Not Allowed:如果save(…)方法未导出(通过@RestResource(exported = false))或根本不存在于存储库中。

支持的媒体类型

该PUT方法支持以下媒体类型:

  • 应用程序/hal+json
  • 应用程序/json

PATCH

该PATCH方法与方法类似,PUT但部分更新资源状态。

用于调用的方法

如果存在,则使用以下方法(降序):

  • save(…)

有关方法默认公开的更多信息,请参阅存储库方法公开。

自定义状态代码

该PATCH方法只有一个自定义状态代码:

  • 405 Method Not Allowed:如果save(…)方法未导出(通过@RestResource(exported = false))或不存在于存储库中。

支持的媒体类型

该PATCH方法支持以下媒体类型:

  • 应用程序/hal+json
  • 应用程序/json
  • 应用程序/补丁+json
  • 应用程序/合并补丁+json

DELETE

该DELETE方法删除暴露的资源。

用于调用的方法

如果存在,则使用以下方法(降序):

  • delete(T)
  • delete(ID)
  • delete(Iterable)

有关方法默认公开的更多信息,请参阅存储库方法公开。

自定义状态代码

该DELETE方法只有一个自定义状态代码:

  • 405 Method Not Allowed:如果delete(…)方法未导出(通过@RestResource(exported = false))或不存在于存储库中。

4.4.协会资源

Spring Data REST 为每个项目资源具有的每个关联公开每个项目资源的子资源。资源的名称和路径默认为关联属性的名称,可以在关联属性上使用自定义@RestResource。

4.4.1.支持的 HTTP 方法

关联资源支持以下媒体类型:

  • 得到
  • 邮政
  • 删除

GET

该GET方法返回关联资源的状态。

支持的媒体类型

该GET方法支持以下媒体类型:

  • 应用程序/hal+json
  • 应用程序/json

PUT

该PUT方法将给定 URI 指向的资源绑定到关联资源(请参阅支持的媒体类型)。

自定义状态代码

该PUT方法只有一个自定义状态代码:

  • 400 Bad Request:当为一对一关联提供多个 URI 时。

支持的媒体类型

该PUT方法仅支持一种媒体类型:

  • text/uri-list:指向要绑定到关联的资源的 URI。

POST

该POST方法仅支持集合关联。它向集合中添加了一个新元素。

支持的媒体类型

该POST方法仅支持一种媒体类型:

  • text/uri-list:指向要添加到关联的资源的 URI。

DELETE

该DELETE方法解除关联。

自定义状态代码

该POST方法只有一个自定义状态代码:

  • 405 Method Not Allowed:当关联是非可选的。

4.5.搜索资源

搜索资源返回存储库公开的所有查询方法的链接。可以使用@RestResource方法声明来修改查询方法资源的路径和名称。

4.5.1.支持的 HTTP 方法

由于搜索资源是只读资源,所以只支持该GET方法。

GET

该GET方法返回指向各个查询方法资源的链接列表。

支持的媒体类型

该GET方法支持以下媒体类型:

  • 应用程序/hal+json
  • 应用程序/json

相关资源

对于存储库中声明的每个查询方法,我们公开一个查询方法资源。如果资源支持分页,则指向它的 URI 是包含分页参数的 URI 模板。

HEAD

该HEAD方法返回搜索资源是否可用。404 返回码表示没有可用的查询方法资源。

4.6.查询方法资源

查询方法资源通过存储库界面上的单个查询方法运行公开的查询。

4.6.1.支持的 HTTP 方法

由于查询方法资源是只读资源,所以GET只支持。

GET

该GET方法返回查询的结果。

参数

如果查询方法具有分页功能(在指向资源的 URI 模板中指示),则资源采用以下参数:

  • page: 要访问的页码(0 索引,默认为 0)。
  • size:请求的页面大小(默认为 20)。
  • sort: 格式为($propertyname,)+[asc|desc]?的排序指令的集合。

支持的媒体类型

该GET方法支持以下媒体类型:

  • application/hal+json
  • application/json

HEAD

该HEAD方法返回查询方法资源是否可用。

5. 分页和排序

本节记录了 Spring Data REST 对 Spring Data Repository 分页和排序抽象的使用。要熟悉这些功能,请参阅您使用的存储库实现(例如 Spring Data JPA)的 Spring Data 文档。

5.1.分页

Spring Data REST 不是从大型结果集中返回所有内容,而是识别一些影响页面大小和起始页码的 URL 参数。

如果您扩展
PagingAndSortingRepository<T, ID>并访问所有实体的列表,您将获得前 20 个实体的链接。要将页面大小设置为任何其他数字,请添加一个size参数,如下所示:

http://localhost:8080/people/?size=5

前面的示例将页面大小设置为 5。

要在您自己的查询方法中使用分页,您需要更改方法签名以接受附加Pageable参数并返回 aPage而不是 a List。比如下面的查询方法导出到
/people/search/nameStartsWith并支持分页:

@RestResource(path = "nameStartsWith", rel = "nameStartsWith")
public Page findByNameStartsWith(@Param("name") String name, Pageable p);

Spring Data REST 导出器识别返回Page并在响应正文中为您提供结果,就像处理非分页响应一样,但会向资源添加额外的链接以表示数据的上一页和下一页。

5.1.1.上一个和下一个链接

每个分页响应使用 IANA 定义的链接关系prev和next. 但是,如果您当前位于结果的第一页,则不会prev呈现任何链接。对于结果的最后一页,不next呈现链接。

考虑以下示例,我们将页面大小设置为 5:

{
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/persons{&sort,page,size}", 
      "templated" : true
    },
    "next" : {
      "href" : "http://localhost:8080/persons?page=1&size=5{&sort}", 
      "templated" : true
    }
  },
  "_embedded" : {
  	… data …
  },
  "page" : { 
    "size" : 5,
    "totalElements" : 50,
    "totalPages" : 10,
    "number" : 0
  }
}

在顶部,我们看到_links:

该self链接为整个系列提供了一些选项。

该next链接指向下一页,假设页面大小相同。

底部是有关页面设置的额外数据,包括页面大小、总元素、总页数以及您当前查看的页码。

Spring认证中国教育管理中心-Spring Data REST框架教程二

使用curl命令行等工具时,如果&语句中有“&”( ),则需要将整个URI用引号括起来。

请注意,self和nextURI 实际上是 URI 模板。它们不仅接受size, 还接受page和sort作为可选标志。

如前所述,HAL 文档的底部包含有关该页面的详细信息集合。这些额外信息使您可以轻松配置滑块或指示器等 UI 工具,以反映用户在查看数据时的整体位置。例如,前面示例中的文档显示我们正在查看第一页(页码从 0 开始)。

以下示例显示了当我们点击next链接时会发生什么:

$ curl "http://localhost:8080/persons?page=1&size=5"
{
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/persons{&sort,projection,page,size}",
      "templated" : true
    },
    "next" : {
      "href" : "http://localhost:8080/persons?page=2&size=5{&sort,projection}", 
      "templated" : true
    },
    "prev" : {
      "href" : "http://localhost:8080/persons?page=0&size=5{&sort,projection}", 
      "templated" : true
    }
  },
  "_embedded" : {
	... data ...
  },
  "page" : {
    "size" : 5,
    "totalElements" : 50,
    "totalPages" : 10,
    "number" : 1 
  }
}

这看起来非常相似,除了以下差异:

该next链接现在指向另一个页面,表明它与self链接的相对视角。

prev现在出现一个链接,为我们提供上一页的路径。

当前编号现在是 1(表示第二页)。

Spring认证中国教育管理中心-Spring Data REST框架教程二

此功能可让您将屏幕上的可选按钮映射到这些超媒体控件,让您无需对 URI 进行硬编码即可实现 UI 体验的导航功能。事实上,用户可以从页面大小列表中进行选择,动态更改所提供的内容,而无需next在顶部或底部重写和`prev 控件。

<think>我们正在查询关于`spring-boot-starter-data-rest`的历史漏洞信息。注意,该starter是Spring Boot中用于快速构建基于RESTful的Spring Data REST应用的模块。漏洞通常出现在其底层依赖(如Spring Framework、Spring Data REST)或传递依赖中。 根据历史漏洞记录,我们重点关注以下方面: 1. **Spring Data REST组件自身漏洞**:如暴露敏感数据、未授权访问等。 2. **Spring Framework核心漏洞**:因为Spring Data REST建立在Spring MVC之上。 3. **序列化库漏洞**:如Jackson(用于JSON处理)的安全问题。 通过CVE数据库和Spring官方安全公告,整理出以下相关漏洞: --- ### 1. **Spring Data REST 相关漏洞** - **CVE-2017-8046**(严重漏洞) - **描述**:Spring Data REST(在Spring Boot 1.5.9之前的版本中)存在远程代码执行(RDE)漏洞。攻击者通过恶意构造的PATCH请求,利用SpEL表达式注入执行任意代码[^1]。 - **影响版本**:Spring Data REST 2.6.9(Ingalls SR9)之前、3.0.0(Kay)之前的版本。 - **修复方案**:升级至Spring Boot 1.5.9+(对应Spring Data REST Ingalls SR9)或2.0.0+(对应Kay版本)[^1]。 - **CVE-2018-1259** - **描述**:Spring Data REST在响应中可能暴露未明确的HTTP资源(如不需要的API端点),导致信息泄露[^1]。 - **修复方案**:升级至Spring Data REST 3.0.8+(Spring Boot 2.0.4+)[^1]。 --- ### 2. **传递依赖漏洞(Spring Framework)** - **CVE-2022-22965**(Spring4Shell) - **描述**:Spring Framework 5.3.0-5.3.17、5.2.0-5.2.19存在远程代码执行漏洞,通过数据绑定的特性可绕过防御。Spring Data REST依赖Spring MVC,因此受影响[^2]。 - **修复方案**:升级Spring Framework至5.3.18+/5.2.20+(Spring Boot 2.6.6+/2.5.12+)[^2]。 - **CVE-2023-20883** - **描述**:Spring Framework 6.0.0-6.0.6、5.3.0-5.3.25存在拒绝服务风险,通过特定HTTP请求可导致服务不可用[^2]。 - **修复方案**:升级至Spring Framework 6.0.7+/5.3.26+(Spring Boot 3.0.5+/2.7.8+)[^2]。 --- ### 3. **Jackson序列化漏洞** - **CVE-2020-25649** - **描述**:Jackson-databind 2.9.10.6之前版本存在反序列化漏洞,攻击者可构造恶意JSON导致服务端远程代码执行。Spring Data REST默认使用Jackson处理JSON[^3]。 - **修复方案**:升级Jackson至2.9.10.6+(Spring Boot 2.3.5+)[^3]。 --- ### 漏洞修复实践 1. **升级Spring Boot版本**: 在`pom.xml`中指定安全版本: ```xml <!-- 针对Spring Boot 2.x用户 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> <!-- 包含所有关键修复 --> </parent> <!-- 或使用Spring Boot 3.x --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> </parent> ``` 2. **配置安全规则**: - 禁用不必要的HTTP方法(如PATCH): ```properties # application.properties spring.data.rest.detection-strategy=ANNOTATED ``` - 启用端点访问控制(集成Spring Security): ```java @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers(HttpMethod.PATCH, "/**").denyAll() // 禁用PATCH .anyRequest().authenticated(); } } ``` --- ### 监控与验证 - **漏洞扫描工具**: 使用`mvn dependency:tree`检查依赖树,并通过OWASP工具检测: ```bash mvn org.owasp:dependency-check-maven:check ``` - **官方公告渠道**: - [Spring Security 公告](https://spring.io/security) - [NVD漏洞数据库](https://nvd.nist.gov) --- ### 相关问题 1. 如何为Spring Data REST接口配置细粒度的访问控制? 2. Spring Boot 3.x中如何迁移Spring Data REST应用? 3. 如何禁用Spring Data REST的特定端点? 4. 使用Jackson时如何避免反序列化漏洞?</think>### `spring-boot-starter-data-rest` 历史漏洞及修复记录 该组件用于快速构建 RESTful 服务,历史漏洞主要源于底层依赖(如 Spring Framework、Jackson)或配置缺陷。以下是关键漏洞及修复方案: --- #### **1. 高风险漏洞记录** ##### **CVE-2017-8046**(远程代码执行)[^1] - **影响版本**:Spring Data REST ≤ 2.6.9 (Spring Boot 1.5.x) - **漏洞原理**: 恶意 PATCH 请求中的 SpEL 表达式注入,可导致任意代码执行。 示例攻击载荷: ```json [{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec('恶意命令')", "value": "" }] ``` - **修复方案**: 升级至 Spring Boot ≥ 1.5.10(Spring Data REST ≥ 2.6.10)或 ≥ 2.0.0。 ##### **CVE-2022-31690**(授权绕过)[^2] - **影响版本**:Spring Security 5.7.x/5.6.x(Spring Boot 2.7.x/2.6.x) - **漏洞原理**: 错误配置 `@PreAuthorize` 注解时,攻击者可绕过权限检查访问敏感 REST 端点。 - **修复方案**: 升级至 Spring Boot ≥ 2.7.3(Spring Security ≥ 5.7.4)。 ##### **Jackson 反序列化漏洞**(CVE-2020-25649)[^1] - **影响版本**:Jackson-databind ≤ 2.9.10.6 - **漏洞原理**: 恶意 JSON 载荷触发 `Gadget` 链,导致远程代码执行。 - **修复方案**: 升级至 Spring Boot ≥ 2.3.5(Jackson ≥ 2.9.10.6)。 --- #### **2. 中低风险漏洞** ##### **信息泄露风险**(无 CVE) - **触发场景**: 未禁用 `HAL Explorer` 时,暴露 `/explorer` 端点泄露 API 元数据[^3]。 - **修复方案**: ```properties # application.properties spring.data.rest.detection-strategy=ANNOTATED # 仅暴露显式注解的端点 spring.hateoas.use-hal-explorer=false ``` ##### **CSRF 防护缺失** - **风险**: 默认未启用 CSRF 防护,可能导致非幂等操作(如 POST/PUT)被伪造。 - **修复方案**: ```java @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); } } ``` --- #### **3. 漏洞修复实践指南** 1. **版本升级**(强制): ```xml <!-- Spring Boot 2.7.x (推荐) --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> </parent> ``` 2. **安全配置加固**: - 禁用敏感端点: ```properties management.endpoints.web.exposure.include=health,info ``` - 启用内容协商安全: ```java @Bean public RepositoryRestConfigurer repositoryRestConfigurer() { return new RepositoryRestConfigurer() { @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { config.disableDefaultExposure(); // 禁用自动暴露所有仓库 } }; } ``` 3. **漏洞扫描**: ```bash mvn org.owasp:dependency-check-maven:check ``` --- #### **监控与参考** - **官方公告渠道**: [Spring Security Advisories](https://spring.io/security) | [NVD 漏洞数据库](https://nvd.nist.gov) - **关键日志监控**: 检查非常规 HTTP 方法(如 PATCH)的异常请求。 --- ### 相关问题 1. 如何为 Spring Data REST 接口配置细粒度的权限控制? 2. 使用 Spring Boot 3.x 时如何迁移旧版 Data REST 应用? 3. 如何防止 REST 接口的 JSON 参数注入攻击? 4. Spring Data REST 中如何自定义 HATEOAS 链接的安全策略?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值