我正在使用OrientDB中的钩子功能来对调用者“透明地”实现某些文档字段的加密。 基本上这个过程是:
1:当onRecordBeforeCreate或onRecordBeforeUpdate事件触发时,我们对某些数据字段应用加密并在创建或更新之前更改文档
byte[] data = doc.field("data");
byte[] encrypted = encrypt(data);
doc.field("data", encrypted);
2:当onRecordAfterRead触发时,我们从文档字段中获取加密数据,解密它们,然后使用解密数据再次更改文档字段。
byte[] encrypted = doc.field("data");
byte[] decrypted = decrypt(encrypted);
doc.field("data", decrypted);
问题是事件onRecordAfterRead是两次触发并且第一次数据正确解密(因为是加密的)但是第二次解密失败因为我们已经解密了它,因此文档“加载”失败
如果我执行加载文档的查询使用过滤器(where子句)中的文档的某些字段,则会发生这种情况。 例如,以下查询不会触发问题:
select count from Data;
但以下查询会触发问题:
select from Data where status ="processed";
这是因为我在状态字段中没有索引。如果我添加一个索引,那么它只会触发一次事件。所以这与索引的使用与否有关。 如果OrientDB在执行查询时“扫描”文档,是否应该触发事件?它不应该只在匹配的文件实际加载时才开火吗?有办法解决这个问题吗?
答案 0 :(得分:0)
onRecordAfterRead应该被调用一次,如果被多次调用应该是一个bug,你可以在https://github.com/orientechnologies/orientdb/issues上用一个重现问题的测试用例来报告它。