【发布时间】:2014-01-23 16:33:34
【问题描述】:
我们的数据存储在 MongoDB 2.4.8 中,并使用 ElasticSearch MongoDB River 1.7.3 索引到 ElasticSearch 0.90.7。
我们的数据索引正确,我可以成功搜索到我们想要搜索的字段。但我还需要过滤权限——当然我们只想返回调用用户实际可以读取的结果。
在我们服务器上的代码中,我将调用用户的权限作为一个数组,例如:
[ "Role:REGISTERED_USER", "Account:52c74b25da06f102c90d52f4", "Role:USER", "Group:52cb057cda06ca463e78f0d7" ]
我们正在搜索的单位数据示例如下:
{
"_id" : ObjectId("52dffbd6da06422559386f7d"),
"content" : "various stuff",
"ownerId" : ObjectId("52d96bfada0695fcbdb41daf"),
"acls" : [
{
"accessMap" : {},
"sourceClass" : "com.bulb.learn.domain.units.PublishedPageUnit",
"sourceId" : ObjectId("52dffbd6da06422559386f7d")
},
{
"accessMap" : {
"Role:USER" : {
"allow" : [
"READ"
]
},
"Account:52d96bfada0695fcbdb41daf" : {
"allow" : [
"CREATE",
"READ",
"UPDATE",
"DELETE",
"GRANT"
]
}
},
"sourceClass" : "com.bulb.learn.domain.units.CompositeUnit",
"sourceId" : ObjectId("52dffb54da06422559386f57")
}
]
}
在上面的示例数据中,我已将所有可搜索的内容替换为
"content" : "various stuff"
授权数据在“acls”数组中。我需要编写的过滤器将执行以下操作(英文):
pass all units where the "acls" array
contains an "accessMap" object
that contains a property whose name is one of the user's authorization strings
and whose "allow" property contains "READ"
and whose "deny" property does not contain "READ"
在上面的例子中,用户有“Role:USER”授权,而这个单元有一个accessMap,它有“Role:USER”,其中包含“allow”,其中包含“READ”,以及“Role:USER”不包含“拒绝”。所以这个单元会通过过滤器。
我没有看到如何使用 ElasticSearch 编写过滤器。
我的印象是有两种方法可以处理这样的嵌套数组:“nested”或“has_child”(或“has_parent”)。
我们不愿意使用“嵌套”过滤器,因为它显然需要在任何数据更改时重新索引整个块。可搜索的内容和授权数据可以随时更改,以响应用户操作。
在我看来,为了使用“has_child”或“has_parent”,授权数据必须与单元数据分开(在不同的集合中?),当一个节点被索引时,它会必须指定其父或子。我不知道 ElasticSearch MongoDB River 是否能够做到这一点。
那么这甚至可能吗?还是我们应该重新排列授权数据?
【问题讨论】:
-
我会为不同级别的访问使用单独的索引,并将访问控制添加到 ES 之上的代理。
标签: elasticsearch