在 elasticsearch 中创建安全过滤器

Creating a security filter in elasticsearch

我正在尝试创建某种安全过滤器以排除某些用户查看 elasticsearch 中的某些文档。例如,如果文档包含 "ABC:123" 和 "ABC:XYZ",用户必须在其配置文件中同时包含这两个内容才能查看该文档。我们正在使用小胡子模板即时创建它。我的第一次尝试是沿着这些方向:

"bool": {
    "filter": {
        "bool": {
            "minimum_should_match": 1,
            "should": {
                "bool": [{
                    "must_not": {
                        "prefix": {
                            "controlSet": "ABC:"
                        }
                    }
                },{
                    "must": {
                        "terms": {
                            "controlSet": ["ABC:123","ABC:XYZ"]
                        }
                    }
                }]
            }
        }
    }
}

但是,我很快意识到这将允许具有一个控件的用户查看具有多个控件的文档。文档必须具有用户必须匹配的控件子集。因此,如果用户只有 "ABC:XYZ",他们不应该能够看到具有 "ABC:123" 的文档,即使该文档还包含 "ABC:XYZ".

有什么方法可以实现我所缺少的吗?目前我们枚举系统中的所有控件并将它们添加到 must_not 但控件会定期更改,我不想手动维护该列表。

假设您的文档如下所示:

{
    ...
    "controlSet": ["ABC:123", "ABC:XYZ"],
    ...
}

controlSet 是一个 keyword 字段,下面的查询应该可以解决问题:

{
    "bool": {
        "filter": {
            "terms": {
                "controlSet": ["ABC:123", "ABC:XYZ"]
            }
       }
    }
}

它将匹配 controlSet 至少有 ABC:123ABC:XYZ

的文档

我可能找到了解决办法...

{
    "bool": {
        "must_not": {
            "regexp": {
                "value": "ABC:~(XYZ|123)",
                "flags": "COMPLEMENT"
            }
        }
    }
}

这应该允许包含 ABC:XYZ 或 ABC:123(或两者)的文档,同时排除包含 ABC:[anything else]

的文档

当然我担心正则表达式的速度,但我认为缺少通配符会使其相对较快。