MongoJsonSchema.builder () не создает SchemaMap с той же спецификацией, что и MongoDB CSFLE с расширенной JSON схемой - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь внедрить Automati c Клиентское шифрование на уровне поля (CSFLE) в MongoDB (Enterprize Edition). Шаги, представленные в MongoDB Docs , работают отлично. Однако spring-data-mongodb предоставляет способ генерации $ jsonSchema с использованием класса MongoJsonSchema.builder (), чтобы избежать написания схемы в raw JSON.

Проблема, с которой я сталкиваюсь, заключается в том, что схема, сгенерированная MongoJsonSchem.builder() отличается от упомянутой спецификации и примера, приведенного в Документах MongoDB здесь . Чтобы указать c, в примере есть

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

, но схема, сгенерированная компоновщиком, имеет

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

Выполнение завершается ошибкой только потому, что формат ключа не соответствует формату драйвера ожидает.

К сожалению, EncryptedJsonSchemaProperty имеет только keyId(), который принимает строку, и keys(), который принимает массив UUID. Оба метода генерируют схему, которая не соответствует примеру.

Есть ли что-то, что мне не хватает, или же конструктор не предназначен для использования для генерации SchemaMap, который может быть передан * 1023? * пока.

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Видимо, проблема не была вообще в MongoJsonSchemaBuilder. Он строит схему просто отлично. Это было преобразование в BsonDocument, которое преобразовывало UUID в представление версии 3. AutoEncryptionSettings нужен BsonDocument для schemaMap().

Наконец, мне пришлось предоставить в CodecRegistry с UuidCodec с STANDARD представлением UUID. Также пришлось собрать MongoClient с этим кодом c registery и все работало просто отлично.

Пример кода:

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

1 голос
/ 16 апреля 2020

Синтаксис $type является устаревшим расширенным json и описан здесь . Теоретически, любой синтаксический анализ расширенного json должен понимать оба формата ($subtype и $type разновидностей).

Типы UUID недавно были стандартизированы здесь . Автоматическое преобразование c невозможно из типа 3 в тип 4, поскольку существует несколько различных реализаций, которые используют тип 3, но хранят байты в другом порядке. Так что это нужно исправить на стороне производителя.

Я не пишу Java сам, но, надеюсь, это поможет определить, где что-то идет не так.

...