我正在使用 ES 5.1.2,我想为每个/_search 请求进行一些简单的身份验证 key 查找。
我在elastic.co上没有找到非常详细的插件开发指南,目前我找到的唯一文档是这个http://david.pilato.fr/blog/2016/10/19/adding-a-new-rest-endpoint-to-elasticsearch-updated-for-ga/ ,但它是关于创建另一个端点。
我找到了 search-guard 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 请求 header 。
== 更新 ==
发现我可以使用堆栈跟踪来获取调用历史记录,所以对于 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
最佳答案
我找到了一个临时解决方案,源代码是here .
长话短说,当你的插件实现为 RestHandler
(通常使用新端点),您可以跳过 registerHandler
做registerFilter
只要。我在 RestFilter
中实现我的逻辑.这是有效的,因为在 ElasticSearch source code , 当 RestController
收到一个新请求,它会检查你是否有任何 RestFilter
,如果你这样做,那么它将通过整个过滤器链,然后根据请求 URI 分派(dispatch)到特定的处理程序。
在 search guard 5似乎有一种方法可以直接注册 RestFilter
在 RestController
不创建 RestHandler
,但我不了解整个流程,所以我没有使用它。
我的主要引用资料:
关于elasticsearch - 如何编写 elasticsearch 插件来扩展/_search 端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42844991/