读取Elasticsearch插件中的文件

我正在编写一个elasticsearch插件,它依赖于从磁盘上的文件中读取数据。 当我尝试在我的代码中访问此文件时,我得到以下exception。

Caused by: java.security.AccessControlException: access denied ("java.io.FilePermission" "patient_similarity/codes.txt" "read") at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) at java.security.AccessController.checkPermission(AccessController.java:884) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.SecurityManager.checkRead(SecurityManager.java:888) at java.io.FileInputStream.(FileInputStream.java:127) at org.gatech.lucene.search.store.DotProductStore.(DotProductStore.java:22) at org.gatech.lucene.search.store.DotProductStore.newInstance(DotProductStore.java:71) at org.gatech.elasticsearch.CommonsPlugin.onModule(CommonsPlugin.java:39) 

有没有推荐的方法来访问elasticsearch插件中的文件? 有没有快速的解决方法来访问我的插件中的文件?

一种方法是通过禁用安全管理器来启动Elasticsearch进程,如下所示:

  bin/elasticsearch -Dsecurity.manager.enabled=false 

从ES 2.x开始,Java安全管理器默认启用,之前已禁用。 但请注意,此选项将在2.3中删除,因为它会使您的ES流程容易受到攻击。

执行此操作的正确方法是自定义安全策略并使用策略文件指定要访问的文件 :

 grant { permission java.io.FilePermission "/tmp/patient_similarity/codes.txt", "read,write"; }; 

您可以在四个不同的位置添加此策略:

  1. 系统范围内的$JAVA_HOME/lib/security/java.policy
  2. 或者只是/home/elasticsearch/.java.policy中的/home/elasticsearch/.java.policy用户
  3. 或者从命令行中指定的文件: -Djava.security.policy=someURL
  4. 或者在plugin-security.policy 包含的plugin-security.policy文件中 。

由于您正在开发插件,您当然应该使用选项4。

我的弹性搜索RestHandler插件中有类似的问题,我正在阅读来自某些url的文件内容说“ http://google.com/content.json ”我通过以下方法解决了这个问题 –

  ` String url = "http://google.com/content.json"; URL fileUrl = new URL(url); InputStream is = fileUrl.openStream(); `