使用 Spring Vault returns 状态 400 写入对象:未提供数据

Writing object with Spring Vault returns Status 400 : no data provided

我正在研究如何使用 Vault 0.11.1 和 Spring Vault 2.0.2.RELEASE。我已经设置了一个开发库:

vault server -dev

并添加了一些数据

vault kv put secret/certs/jan cert=ABCD

我可以用 Spring Vault

阅读
      @Autowired
      private VaultOperations operations;

            String path = "secret/data/certs/jan";
            System.out.println(operations.read(path).getData());

请注意,奇怪的是,我必须在路径中插入 "data/" 才能再次找到它。

删除数据也能正常工作:

            operations.delete(path);

但用

写入数据
            Secret secret = new Secret("ABCD");
            operations.write(path, secret);

失败

org.springframework.vault.VaultException: Status 400 secret/data/certs/jan: no data provided

秘密是一个简单的豆子:

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Secret {
    String cert;
}

而且 jason 转换似乎很顺利:

DEBUG org.springframework.web.client.RestTemplate - Writing [Secret(cert=ABCD)] using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@add0edd]

只是想写一个字符串

            operations.write(path, "foo=bar");

同样失败:

Status 400 secret/data/certs/jan: failed to parse JSON input: invalid character 'o' in literal false (expecting 'a')

您似乎在使用 Vault 的版本化键值后端。 Vault 0.10 和更新版本的新实例默认将版本化后端安装在 secret/,这需要您使用特定的 API。

未版本化 (v1) 和版本化 (v2) 键值后端之间存在细微的 API 差异,这些差异向上下文路径和实际 JSON 有效负载添加了额外的元素。

键值后端 v1 示例:

POST /v1/secret/certs/jan

{"key":"value"}

键值后端 v2 示例:

POST /v1/secret/data/certs/jan

{"data":{"key":"value"}}

要使用 Spring Vault,这意味着您需要升级到版本 2.1.0 并使用 VaultKeyValueOperations API:

VaultKeyValueOperations keyValue = vaultOperations.opsForKeyValue("secret", KeyValueBackend.versioned());
keyValue.put("certs/jan", secret);