禁止在 Spring 数据 REST 中的 create/update 请求中设置审核字段

Disable setting up Audit fields in create/update requests in Spring Data REST

我正在使用各种 Spring 组件的组合 - 引导 (2.3)、数据、数据 REST、Springdoc。在我的模型对象中,我使用审计——我用@CreatedBy、@CreatedDate 等注释一些字段。我想禁用通过 REST API 设置这些审计字段值的可能性。同时,我希望在检索数据时可以使用此信息。

这似乎是一件很明显的事情,但我无法找到一种方法来做到这一点。默认情况下,我可以轻松地在 API 调用中提供这些值并看到它们持续存在。

理想情况下,此类配置更改在 Springdoc(在请求模型中)生成的 OpenAPI 规范中也可见。

我猜问题出在你糟糕的设计上。请考虑您的设计是否正确。我想在您的设计中,除了 Spring 数据 REST 端点(API)之外,还有其他代码可以创建和更新您的对象并保存到数据库。

您的问题与 Spring Data REST 无关。用@Createdxx 和@LastModifiedxx 注释的审计字段由Spring 数据存储库自动更新,并且Spring Data REST 只是调用Spring 数据存储库来保存数据。

回答以下两个问题有助于阐明您的设计。

问题一: 如果您想保留默认由 Spring Data REST 创建的 create (POST) 端点,并且您不希望设置用 @Createdxx 注释的审计字段,那么什么代码负责设置那些审计字段? 假设你发送一个 POST 请求来创建一个对象,你希望 createdBycreatedDate 为空吗?或者 createdBycreatedDate 稍后会被其他代码更新吗?

问题二: 如果您想保留由 Spring Data REST 默认创建的更新 (PUT/PATCH) 端点,并且您不希望更新用 @LastModifiedxx 注释的审计字段,那么什么代码负责更新那些审计领域?这也会导致审核不完整(您进行了更新,但未更新 lastModified 信息)。

原来是我傻:)

所以我的错误是当时禁用了身份验证和授权。启用后,我无法为 createdBy 和其他字段提供值,因为它们刚刚被正确的值覆盖。

当谈到 OpenAPI 规范时,我不得不用以下方式注释字段:

@Schema(accessMode = Schema.AccessMode.READ_ONLY)

来自 io.swagger.v3.oas.annotations.media.Schema;。这导致了正确的信息。查看 Swagger 视图: