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

本文档介绍了SpringDataREST框架的使用,它简化了构建RESTful服务的流程,减少了样板代码。SpringDataREST基于SpringData存储库,自动将其导出为REST资源。通过在SpringBoot项目中添加相应依赖,可以轻松集成SpringDataREST。配置包括设置存储库检测策略、更改基本URI和其他属性。默认情况下,SpringDataREST遵循存储库接口公开HTTP资源,支持CRUD操作,并遵循HATEOAS原则进行资源发现。文章还详细讨论了资源暴露、默认状态代码以及如何自定义行为。

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

参考文档

2. 介绍

REST Web 服务已成为 Web 上应用程序集成的首选方法。在其核心,REST 定义了一个系统,该系统由客户端交互的资源组成。这些资源以超媒体驱动的方式实现。Spring MVC和Spring WebFlux都为构建这些类型的服务提供了坚实的基础。然而,即使为多域对象系统实现最简单的 REST Web 服务原则也可能非常乏味,并会产生大量样板代码。

Spring Data REST 构建在 Spring Data 存储库之上,并自动将它们导出为 REST 资源。它利用超媒体让客户端自动查找存储库公开的功能,并将这些资源集成到相关的基于超媒体的功能中。

3. 入门

Spring Data REST 本身就是一个 Spring MVC 应用程序,它的设计方式使其可以轻松地与您现有的 Spring MVC 应用程序集成。现有(或未来)的服务层可以与 Spring Data REST 一起运行,只需少量的额外工作。

3.1.将 Spring Data REST 添加到 Spring Boot 项目

最简单的入门方法是构建一个 Spring Boot 应用程序,因为 Spring Boot 有一个适用于 Spring Data REST 的启动器并使用自动配置。以下示例展示了如何使用 Gradle 在 Spring Boot 项目中包含 Spring Data Rest:

示例 3. 使用 Gradle 配置 Spring Boot

dependencies {
  ...
  compile("org.springframework.boot:spring-boot-starter-data-rest")
  ...
}

以下示例展示了如何使用 Maven 在 Spring Boot 项目中包含 Spring Data Rest:

示例 4. 使用 Maven 配置 Spring Boot

<dependencies>
  ...
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-rest</artifactId>
  </dependency>
  ...
</dependencies>

如果您使用Spring Boot Gradle 插件或Spring Boot Maven 插件,则无需提供版本号。

当您使用 Spring Boot 时,Spring Data REST 会自动配置。

3.2.将 Spring Data REST 添加到 Gradle 项目

要将 Spring Data REST 添加到基于 Gradle 的项目,请将spring-data-rest-webmvc工件添加到编译时依赖项,如下所示:

dependencies {
  … other project dependencies
  compile("org.springframework.data:spring-data-rest-webmvc:3.6.0")
}

3.3.将 Spring Data REST 添加到 Maven 项目

要将 Spring Data REST 添加到基于 Maven 的项目,请将spring-data-rest-webmvc工件添加到编译时依赖项,如下所示:

<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-rest-webmvc</artifactId>
  <version>3.6.0</version>
</dependency>

3.4.配置 Spring Data REST

要将 Spring Data REST 与现有 Spring MVC 应用程序一起安装,您需要包含适当的 MVC 配置。Spring Data REST 配置在一个名为的类中定义,
RepositoryRestMvcConfiguration您可以将该类导入到应用程序的配置中。

如果您使用 Spring Boot 的自动配置,则不需要此步骤。当您包含
spring-boot-starter-data-rest并且在您的依赖项列表中,您的应用程序被标记为@SpringBootApplication或时,Spring Boot 会自动启用 Spring Data REST @EnableAutoConfiguration。

要自定义配置,请注册 aRepositoryRestConfigurer并实施或覆盖与configure…您的用例相关的-methods。

确保您还为您使用的商店配置 Spring Data 存储库。有关详细信息,请参阅相应 Spring Data 模块的参考文档。

3.5.Spring Data REST 的基本设置

本节介绍在配置 Spring Data REST 应用程序时可以操作的基本设置,包括:

  • 设置存储库检测策略
  • 更改基本 URI
  • 更改其他 Spring Data REST 属性

3.5.1.设置存储库检测策略

Spring Data REST 使用
RepositoryDetectionStrategy来确定存储库是否作为 REST 资源导出。的RepositoryDiscoveryStrategies列举包括以下值:

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

3.5.2.更改基本 URI

默认情况下,Spring Data REST 在根 URI“/”处提供 REST 资源。有多种方法可以更改基本路径。

对于 Spring Boot 1.2 及更高版本,您可以通过在 中设置单个属性来更改基本 URI application.properties,如下所示:

spring.data.rest.basePath=/api

使用 Spring Boot 1.1 或更早版本,或者如果您不使用 Spring Boot,您可以执行以下操作:

@Configuration
class CustomRestMvcConfiguration {

  @Bean
  public RepositoryRestConfigurer repositoryRestConfigurer() {

    return new RepositoryRestConfigurer() {

      @Override
      public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) {
        config.setBasePath("/api");
      }
    };
  }
}

或者,您可以将 的自定义实现注册RepositoryRestConfigurer为 Spring bean,并确保它被组件扫描选中,如下所示:

@Component
public class CustomizedRestMvcConfiguration extends RepositoryRestConfigurer {

  @Override
  public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) {
    config.setBasePath("/api");
  }
}

上述两种方法都将基本路径更改为/api.

3.5.3.更改其他 Spring Data REST 属性

您可以更改以下属性:

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

3.6.启动应用程序

此时,您还必须配置您的密钥数据存储。

Spring Data REST 官方支持:

  • 弹簧数据 JPA
  • 春季数据MongoDB
  • 弹簧数据 Neo4j
  • Spring Data GemFire
  • Spring Data Cassandra

以下入门指南可以帮助您快速入门和运行:

  • 弹簧数据 JPA
  • 春季数据MongoDB
  • 弹簧数据 Neo4j
  • Spring Data GemFire

这些链接指南介绍了如何为相关数据存储添加依赖项、配置域对象和定义存储库。

您可以将应用程序作为 Spring Boot 应用程序(使用前面显示的链接)运行,也可以将其配置为经典的 Spring MVC 应用程序。

通常,Spring Data REST 不会向给定的数据存储添加功能。这意味着,根据定义,它应该适用于任何支持存储库编程模型的 Spring Data 项目。上面列出的数据存储是我们编写集成测试以验证 Spring Data REST 与它们一起工作的数据存储。
从这一点来看,您可以使用各种选项自定义 Spring Data REST。

4. 仓库资源

4.1.基本面

Spring Data REST 的核心功能是为 Spring Data 存储库导出资源。因此,要查看并可能自定义导出工作方式的核心工件是存储库接口。考虑以下存储库接口:

public interface OrderRepository extends CrudRepository<Order, Long> { }

对于这个存储库,Spring Data REST 在/orders. 路径源自被管理的域类的非大写、复数、简单的类名。它还为 URI 模板下的存储库管理的每个项目公开一个项目资源/orders/{id}。

默认情况下,与这些资源交互的 HTTP 方法映射到CrudRepository. 在关于收藏资源和项目资源的部分中阅读更多相关信息。

4.1.1.存储库方法暴露

为某个存储库公开哪些 HTTP 资源主要由存储库的结构驱动。换句话说,资源公开将遵循您在存储库中公开的方法。如果您扩展CrudRepository,通常会公开公开所有 HTTP 资源所需的所有方法,我们可以默认注册。下面列出的每个资源都将定义需要存在哪些方法,以便可以为每个资源公开特定的 HTTP 方法。这意味着,没有公开这些方法的存储库——要么根本不声明它们,要么显式使用它们@RestResource(exported = false) ——不会在这些资源上公开这些 HTTP 方法。

有关如何单独调整默认方法公开或专用 HTTP 方法的详细信息,请参阅自定义支持的 HTTP 方法。

4.1.2.默认状态代码

对于暴露的资源,我们使用一组默认状态代码:

  • 200 OK: 对于普通GET请求。
  • 201 Created:对于POST和PUT创造新的资源的请求。
  • 204 No Content: 对于PUT、PATCH和DELETE请求,当配置设置为不返回资源更新的响应主体 ( RepositoryRestConfiguration.setReturnBodyOnUpdate(…)) 时。如果配置值设置为包括对 的响应PUT,200 OK则为更新返回,并201 Created为通过创建的资源返回PUT。

如果配置值 (
RepositoryRestConfiguration.returnBodyOnUpdate(…)和RepositoryRestConfiguration.returnBodyCreate(…)) 显式设置为null ——默认情况下是——,则使用 HTTP 接受标头的存在来确定响应代码。在收藏和物品资源的详细说明中阅读更多相关信息。

4.1.3.资源可发现性

HATEOAS 的一个核心原则是资源应该可以通过发布指向可用资源的链接来发现。关于如何在 JSON 中表示链接,有一些相互竞争的事实上的标准。默认情况下,Spring Data REST 使用HAL来呈现响应。HAL 定义要包含在返回文档的属性中的链接。

资源发现从应用程序的顶层开始。通过向部署 Spring Data REST 应用程序的根 URL 发出请求,客户端可以从返回的 JSON 对象中提取一组链接,这些链接表示客户端可用的下一级资源。

例如,要发现应用程序根目录中有哪些资源可用,请GET向根 URL发出 HTTP ,如下所示:

curl -v http://localhost:8080/

< HTTP/1.1 200 OK
< Content-Type: application/hal+json

{ "_links" : {
    "orders" : {
      "href" : "http://localhost:8080/orders"
    },
    "profile" : {
      "href" : "http://localhost:8080/api/alps"
    }
  }
}

结果文档的属性是一个对象,它由表示关系类型的键组成,并带有 HAL 中指定的嵌套链接对象。

有关该profile链接的更多详细信息,请参阅应用程序级配置文件语义 (ALPS)。

<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 链接的安全策略?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

「已注销」

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

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

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

打赏作者

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

抵扣说明:

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

余额充值