我正在使用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
答案 0 :(得分:1)
我找到了一个临时解决方案,源代码是here。
简而言之,当您将插件实现为RestHandler
时(通常使用新的端点),您可以跳过registerHandler
并仅执行registerFilter
。我在RestFilter
中实现了我的逻辑。这是有效的,因为在ElasticSearch source code中,当RestController
获得新请求时,它会检查您是否有RestFilter
,如果您这样做,它将通过整个过滤器链,然后发送基于请求URI的特定处理程序。
在search guard 5中似乎有一种方法可以在RestFilter
中直接注册RestController
而无需创建RestHandler
,但我不了解整个流程,所以我不使用它。
我的主要参考资料: