我使用javascript-elasticsearch API搜索数据。但是,我需要根据他们的工作室限制对某个群组的访问。例如:
obj1
title = Titanic
studio = Fox
obj2
title = Lion King
studio = Disney
我可以执行查询:?q=&studio=disney
,但这可以在恶意用户的javascript中进行调整以执行q=&studio=
。有没有办法在我正在使用的API密钥或弹性搜索本身中设置此限制(&studio=X
)?如何做到这一点,如果不能做到,那么上述问题的最佳解决方案是什么?
答案 0 :(得分:1)
这可以使用filtered alias来完成。我们的想法是,不是通过索引名称进行搜索,而是通过该索引上的筛选别名进行搜索。这是一个例子。我们假设您的索引movies
的类型为movie
。最基本的搜索方式是:
curl -XPOST localhost:9200/movies/movie/_search?q=...
以这种方式搜索时,您基本上可以访问整个电影索引。如果要将对该索引的某些文档的访问权限限制为某些类型的用户,则可以创建一个别名,该别名仅查询与特定过滤器匹配的文档,如下所示:
curl -XPOST localhost:9200/_aliases -d '{
"actions" : [
{
"add" : {
"index" : "movies",
"alias" : "disney_movies",
"filter" : { "term" : { "studio" : "disney" } }
}
}
]
}'
然后,您可以强制搜索该别名而不是索引。这样做将透明地仅使用studio: disney
搜索电影,并且您不需要在查询本身中明确指定该电影。
curl -XPOST localhost:9200/disney_movies/movie/_search?q=...
如果有人试图篡改studio
变量,则没有匹配的别名,因此没有结果返回,这就是你想要的。