我正在对文档中的特定属性实施手动客户端加密。 MongoDB 文档建议我可以指定一个可用于执行服务器端验证的模式,我尝试进行设置以确保客户端代码正确加密属性。
我在创建集合时指定架构。
var schemaMap = new Dictionary<string, BsonDocument> { { collectionNamespace.CollectionName, schema } };
var options = new AutoEncryptionOptions(
keyVaultNamespace,
kmsProviders,
schemaMap: schemaMap,
bypassAutoEncryption: true);
var settings = MongoClientSettings.FromConnectionString(connectionString);
settings.AutoEncryptionOptions = options;
var client = new MongoClient(settings);
var encryptedDatabase = client.GetDatabase(collectionNamespace.DatabaseNamespace.DatabaseName);
encryptedDatabase.CreateCollection(collectionNamespace.CollectionName);
然后再次创建用于
Insert
文档的 MongoDB 客户端。
var clientSettings = MongoClientSettings.FromConnectionString(connectionString);
var autoEncryptionOptions = new AutoEncryptionOptions(
keyVaultNamespace: keyVaultNamespace,
kmsProviders: kmsProviders,
schemaMap: schemaMap,
bypassAutoEncryption: true
);
clientSettings.AutoEncryptionOptions = autoEncryptionOptions;
var secureClient = new MongoClient(clientSettings);
当我插入一个故意不符合配置架构的文档时,不会抛出任何异常来识别问题。
secureCollection.InsertOne(sampleDocument);
所使用的模式基于 MongoDB 示例代码
我正在使用 Azure Cosmos DB for MongoDB 帐户,服务器版本 4.2。 MongoDB.Driver版本是2.20.0。
我是否误解了模式验证的功能?还是我漏掉了一个步骤?
任何指示都会有用,谢谢。
虽然最初使用
AutoEncryptionOptions
进行模式验证的尝试是不正确的(@dododo 很有帮助地指出),但对如何实现服务器端模式验证的进一步调查导致在创建集合时定义了 Validator
。
encryptedDatabase.CreateCollection(
collectionNamespace.CollectionName,
new CreateCollectionOptions<Student>
{
Validator = new FilterDefinitionBuilder<Student>().JsonSchema(schemaDocument)
});
这种方法仍然不起作用,但这是由于使用的数据库而不是实现造成的。正在研究的解决方案是使用 MongoDB API 访问 Azure CosmosDB。 Microsoft 的答复指出 CosmosDB 不支持此功能
我们从团队获得信息 - Cosmos DB 不支持架构验证
仔细检查 Microsoft Azure Cosmos DB for MongoDB 与 MongoDB Atlas 文档显示“用于数据治理控制的 JSON 架构”“目前正在开发中”
见下图:
bypassAutoEncryption=true
时,您将跳过所有加密逻辑,因此如果该字段之前已加密,则只有解密才会发生。schemaMap
的唯一目标是提供到加密字段的路径,它不会验证文档,如果该路径通向不存在的字段 - 那么整个加密逻辑将被跳过。