在 Elasticsearch 插件中读取文件

Reading a file in an Elasticsearch plugin

我正在编写一个 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插件中访问文件有什么推荐的方法吗?是否有任何快速解决方法来访问我的插件中的文件?

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

 bin/elasticsearch -Dsecurity.manager.enabled=false

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

正确的做法是自定义您的 security policy and specify the file(s) you want to access using 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.

既然你正在开发一个插件,你当然应该使用选项 4。

我在我的 elasticsearch RestHandler 插件中遇到了类似的问题,我正在从一些 url 读取文件内容说“http://google.com/content.json” 我通过以下方法解决了它 -

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