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
中提供 UuidCodec
和 STANDARD
表示的 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
我正在尝试在 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
中提供 UuidCodec
和 STANDARD
表示的 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