MongoJsonSchema.builder() 不会生成与 MongoDB CSFLE 扩展 JSON 模式具有相同规范的 SchemaMap

MongoJsonSchema.builder() does not generate SchemaMap with same specification as MongoDB CSFLE extended JSON Schema

我正在尝试在 MongoDB(企业版)中实施自动客户端字段级加密 (CSFLE)。 MongoDB Docs 中提供的步骤工作得很好。但是,spring-data-mongodb 提供了一种使用 MongoJsonSchema.builder() class 生成 $jsonSchema 的方法,以避免在原始 JSON.

中编写模式

我面临的问题是 MongoJsonSchem.builder() 生成的模式与 MongoDB 文档 here 中提到的规范和示例不同。 具体来说,这个例子有

"keyId": [
      {
        "$binary": {
          "base64": "<paste_your_key_id_here>",
          "subType": "04"
        }
      }
    ]

但构建器生成的架构有

"keyId": [
            {
              "$binary": "<base64 encoded uuid>",
              "$type": "03"
            }
          ]

执行失败只是因为密钥的格式不是驱动程序所期望的格式。

不幸的是,EncryptedJsonSchemaProperty 只有接受字符串的 keyId() 和接受 UUID 数组的 keys()。这两种方法都会生成与示例不匹配的架构。

是否有任何我遗漏的东西,或者构建器是否不打算用于生成 SchemaMap 可以提供给 AutoEncryptionSettings

$type 语法是遗留扩展 json 并在 here 中进行了描述。理论上,任何解析扩展 json 的内容都应该能够理解这两种格式($subtype$type 变体)。

最近对 UUID 类型进行了标准化 here。不可能从类型 3 自动转换为类型 4,因为有多种不同的实现使用类型 3 但以不同的顺序存储字节。所以这需要在生产端解决。

我自己不写 Java 但希望这有助于确定哪里出了问题。

显然,问题根本不在 MongoJsonSchemaBuilder 中。它可以很好地构建模式。将 UUID 转换为版本 3 表示的是到 BsonDocument 的转换。 AutoEncryptionSettings 需要 schemaMap() 的 BsonDocument。

最后,我不得不在 CodecRegistry 中提供 UuidCodecSTANDARD 表示的 UUID。还必须使用此编解码器注册表构建 MongoClient,一切正常。

示例代码:

final CodecRegistry codecRegistry = 
                CodecRegistries.fromRegistries(CodecRegistries.fromCodecs(new UuidCodec(STANDARD)), getDefaultCodecRegistry());
final BsonDocument document = schema.toDocument().toBsonDocument(BsonDocument.class, codecRegistry).getDocument("$jsonSchema");

这终于提供给了AutoEncryptionSettings.builder().schemaMap()

完整的代码示例在此处:https://github.com/nishkarsh/mongodb-auto-csfle-demo