读取Elasticsearch插件中的文件

时间:2016-02-15 05:14:19

标签: java elasticsearch elasticsearch-plugin accesscontrolexception

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

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.<init>(FileInputStream.java:127)
at org.gatech.lucene.search.store.DotProductStore.<init>(DotProductStore.java:22)
at org.gatech.lucene.search.store.DotProductStore.newInstance(DotProductStore.java:71)
at org.gatech.elasticsearch.CommonsPlugin.onModule(CommonsPlugin.java:39)

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

2 个答案:

答案 0 :(得分:12)

执行此操作的一种方法是通过禁用安全管理器来启动Elasticsearch流程,如下所示:

 bin/elasticsearch -Dsecurity.manager.enabled=false

自ES 2.x起,Java安全管理器默认启用,之前已禁用。但请注意,此选项为removed in 2.3,因为它会使您的ES流程容易受到攻击。

这样做的正确方法是自定义security policy并使用policy files指定您要访问的文件:

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

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

  1. $JAVA_HOME/lib/security/java.policy
  2. 中的系统范围
  3. 或仅适用于/home/elasticsearch/.java.policy
  4. 中的elasticsearch用户
  5. 或从命令行中指定的文件:-Djava.security.policy=someURL
  6. plugin-security.policy文件included in your plugin
  7. 由于您正在开发插件,因此您当然应该使用选项4。

答案 1 :(得分:0)

我的弹性搜索RestHandler插件中有一个类似的问题,我正在阅读一些网址中的文件内容&#34; http://google.com/content.json&#34;我通过以下方法解决了这个问题 -

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