2017-03-16 28 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一種方式,但我不明白的整個流程,所以我沒有使用它。

我的主要參考文獻: