在 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";
};
您可以在四个不同的位置添加此策略:
$JAVA_HOME/lib/security/java.policy
中的任一系统范围
- 或仅针对
/home/elasticsearch/.java.policy
中的 elasticsearch 用户
- 或从命令行指定的文件:
-Djava.security.policy=someURL
- 或在
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();
`
我正在编写一个 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";
};
您可以在四个不同的位置添加此策略:
$JAVA_HOME/lib/security/java.policy
中的任一系统范围
- 或仅针对
/home/elasticsearch/.java.policy
中的 elasticsearch 用户
- 或从命令行指定的文件:
-Djava.security.policy=someURL
- 或在
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();
`