如何编写elasticsearch插件来扩展/ _search端点?

时间:2017-03-16 21:20:59

标签: elasticsearch elasticsearch-plugin elasticsearch-5

我正在使用ES 5.1.2,我想为每个/ _search请求做一些简单的身份验证密钥查找。 我没有找到关于elastic.co的非常详细的插件开发指南,到目前为止,我找到的唯一文档是http://david.pilato.fr/blog/2016/10/19/adding-a-new-rest-endpoint-to-elasticsearch-updated-for-ga/,但它是关于创建另一个端点。

我找到了搜索保护https://github.com/floragunncom/search-guard,从源代码中感觉我可以创建自己的插件extends Plugin implements ActionPlugin,但后来我卡住了,不知道该去哪里。

从源代码中我知道我可以添加自己的ActionFilter并将其添加到Plugin中的操作链中,这样所有通过/_search端点的请求也将通过我的ActionFilter {1}}。但是我没有完整的可能操作列表,可能是indices:data/read/search(搜索)或indices:admin/delete(删除索引)。使用try和error有太多了。

另一件事是,在ActionFilter中,如何从Request对象获取POST请求有效负载?在/_search请求中,我获得了SearchRequest,但它没有来自浏览器的http请求标头。

== update ==

发现我可以使用use stack trace来获取调用历史记录,因此对于ActionFilter,调用堆栈就像

at org.elasticsearch.action.support.TransportAction$RequestFilterChain.proceed(TransportAction.java:171)
at org.elasticsearch.action.support.TransportAction.execute(TransportAction.java:145)
at org.elasticsearch.action.support.TransportAction.execute(TransportAction.java:87)
at org.elasticsearch.client.node.NodeClient.executeLocally(NodeClient.java:75)
at org.elasticsearch.client.node.NodeClient.doExecute(NodeClient.java:64)
at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:403)
at org.elasticsearch.client.support.AbstractClient.search(AbstractClient.java:530)
at org.elasticsearch.rest.action.search.RestSearchAction.lambda$prepareRequest$0(RestSearchAction.java:83)
at org.elasticsearch.rest.action.search.RestSearchAction$$Lambda$1405/1241306571.accept(Unknown Source)
at org.elasticsearch.rest.BaseRestHandler.handleRequest(BaseRestHandler.java:82)

RestSearchAction#prepareRequest中,ES使用parseSearchRequest并将RestRequest数据转换为SearchRequest,这意味着我无法在RestRequest中获得ActionFitler }。是否应该有另一种传递此数据的方法?因为我想扩展现有的/_search而不添加另一个端点,所以我想我不应该再创建RestHandler

1 个答案:

答案 0 :(得分:1)

我找到了一个临时解决方案,源代码是here

简而言之,当您将插件实现为RestHandler时(通常使用新的端点),您可以跳过registerHandler并仅执行registerFilter。我在RestFilter中实现了我的逻辑。这是有效的,因为在ElasticSearch source code中,当RestController获得新请求时,它会检查您是否有RestFilter,如果您这样做,它将通过整个过滤器链,然后发送基于请求URI的特定处理程序。

search guard 5中似乎有一种方法可以在RestFilter中直接注册RestController而无需创建RestHandler,但我不了解整个流程,所以我不使用它。

我的主要参考资料: