2017-03-16 90 views
0

我正在使用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/,但它是关于创建另一个端点。如何编写elasticsearch插件来扩展/ _search端点?

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

从源代码中,我知道我可以添加自己的ActionFilter并将其加入到行动链Plugin,使得所有要求我们将向您/_search终端还将赴经过我的ActionFilter。但我没有完整的可能操作列表,可能是indices:data/read/search(搜索)或indices:admin/delete(删除索引)。有太多的使用尝试和错误。

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

== ==更新

发现我可以使用使用堆栈跟踪来获取调用历史,所以对于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,这意味着我无法在ActionFitler中获得RestRequest。应该有另一种方式来传递这些数据吗?因为我想扩展一个已经存在的/_search不添加另一个端点,所以我觉得我不应该创建更多RestHandler

回答

0

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

很长的事情是短的,当你的插件实现为RestHandler(通常带有新的端点)时,你可以跳过registerHandler并且只做registerFilter。我在RestFilter中执行我的逻辑。这是有效的,因为在ElasticSearch source code中,当RestController得到一个新的请求时,它将检查你是否有任何RestFilter,如果你这样做,那么它将通过整个过滤器链,然后根据请求URI调度到特定的处理程序。

search guard 5似乎有直接注册在RestController一个RestFilter而无需创建一个RestHandler一种方式,但我不明白的整个流程,所以我没有使用它。

我的主要参考文献: