2016-06-10 44 views
1

我正在Android Studio中使用Google App Engine开发应用程序后端。我想使用Firebase所以它的一部分SDK的初始化是读取一个Service帐户的凭证JSON文件。我的文件添加到我的“src”目录,并尝试像火力地堡的文档来阅读:在我的Google App Engine项目中拒绝访问文件

FirebaseOptions options = new FirebaseOptions.Builder() 
    .setServiceAccount(new FileInputStream("/src/serviceAccountCredentials.json")) 
    .setDatabaseUrl("https://databaseName.firebaseio.com/") 
    .build(); 

但它总是抛出一个访问文件被拒绝例外:

java.security.AccessControlException: 
    access denied ("java.io.FilePermission" "/src/serviceAccountCredentials.json" "read") 

哪有我将读取权限更改为此文件? 谢谢:)

+0

你把它放到类路径中,所以你应该将它作为资源读取(甚至在App Engine之外) –

+0

@IgorArtamonov你能举个例子如何从这个文件获取FileInputStream作为资源吗?或者如何将它添加为类路径?谢谢 –

+0

不是_file_输入流,只是输入流。我也会给出回答 –

回答

1

您位于源代码目录,所以编译后它应该在classpatch的根目录。但要确保它在那里,它实际上取决于构建工具,其中一些可以忽略src dir中的非源文件,因为这些文件应该位于resources dir中。如果你的情况,移动文件到资源目录。

然后,读取这个文件,你必须使用它作为一种资源:

InputStream cred = this.getClass() 
      .getResourceAsStream("/serviceAccountCredentials.json"); 

FirebaseOptions options = new FirebaseOptions.Builder() 
     .setServiceAccount(cred) 
     .setDatabaseUrl("https://databaseName.firebaseio.com/") 
     .build(); 
+0

这不起作用... getResourcesAsStream返回null ...我也尝试将json移动到资源目录,而不是像你所说的src,仍然不工作:/任何其他可能的方式? –

+0

hm,你可以用斜杠试试吗?即''/serviceAccountCredentials.json''?并确保它在输出类dir –

+0

好吧,问题实际上是json位置......我将它放在项目的根目录中,而不是放在主目录中。现在它可以工作,谢谢! :) –

0

您需要添加的文件在您的AppEngine-web.xml文件中的标签下。

<?xml version="1.0" encoding="utf-8"?> 
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> 
    <application>myApplicationId</application> 
    <version>1</version> 
    <threadsafe>true</threadsafe> 
    <system-properties> 
     <property name="java.util.logging.config.file" value="WEB-INF/logging.properties" /> 
    </system-properties> 
    <resource-files> 
     <include path="secret.json" /> 
    </resource-files> 
</appengine-web-app> 

这样,你的应用程序引擎的服务器会知道,您使用的是只读这个静态资源。