Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 服务器端访问Firestore和安全规则:Firestore客户端已关闭_Java_Google Cloud Firestore_Firebase Security_Server Side - Fatal编程技术网

Java 服务器端访问Firestore和安全规则:Firestore客户端已关闭

Java 服务器端访问Firestore和安全规则:Firestore客户端已关闭,java,google-cloud-firestore,firebase-security,server-side,Java,Google Cloud Firestore,Firebase Security,Server Side,我在Firestore中有数据,我每天都用服务器端Java代码更新这些数据。这已经持续了几个月,没有任何问题。我创建Firestore实例的方式如下所示。 (我在Firestore中有一个服务帐户,其凭据保存在json文件中。) Firestore安全规则还没有成为问题,因为客户端还没有访问Firestore的权限,所以我已经无条件地打开了所有涉及Firestore的集合,以进行读写操作。现在,由于我只希望从myCredentials.json中的凭据创建的对Firestore的服务器端访问具有

我在Firestore中有数据,我每天都用服务器端Java代码更新这些数据。这已经持续了几个月,没有任何问题。我创建Firestore实例的方式如下所示。 (我在Firestore中有一个服务帐户,其凭据保存在json文件中。)

Firestore安全规则还没有成为问题,因为客户端还没有访问Firestore的权限,所以我已经无条件地打开了所有涉及Firestore的集合,以进行读写操作。现在,由于我只希望从myCredentials.json中的凭据创建的对Firestore的服务器端访问具有写入权限,因此我将Firestore安全规则设置如下

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /myCollection/{document=**}{
        allow read;
        allow write: if false;
    }
  }         
}
然而,这些规则阻止了我访问上面创建的Firestore,我也不知道如何设置适当的规则。我理解,如果Firestore实例由创建,则可以绕过任何Firestore安全规则

FirebaseOptions options = FirebaseOptions.builder()
   .setCredentials(myCredentials)
   .setDatabaseUrl("https://myFirestoreProject.firebaseio.com")
   .build();
        
FirebaseApp app = FirebaseApp.initializeApp(options, "myFirestoreApp");
Firestore db = FirestoreClient.getFirestore(app);
现在,当我像这样创建db并运行更新代码时,会收到错误消息

java.lang.IllegalStateException: Firestore client has already been closed
我不会在这里发布精确的更新代码,因为一方面它非常长,另一方面它在创建Firestore实例的第一种类型时运行平稳。然而,更简单的玩具代码工作得很好,所以我检查了安全规则是否确实被第二种类型的Firestore创建绕过了

我使用NetBeans,在上述两种情况下,maven导入如下:

<dependencies>
   <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>libraries-bom</artifactId>
      <version>8.0.0</version>
      <type>pom</type>
      <scope>import</scope>
   </dependency>
   <dependency>
      <groupId>com.google.firebase</groupId>
      <artifactId>firebase-admin</artifactId>
      <version>7.1.1</version>
   </dependency>
</dependencies>>

com.google.cloud
库bom表
8.0.0
聚甲醛
进口
com.google.firebase
firebase管理员
7.1.1
>
这两个Firestore实例之间的差异让我产生了两个问题:

  • 如果我使用最初创建的Firestore,我是否可以设置安全规则,以便授予此Firestore实例写入权限,同时阻止任何客户端写入访问(例如来自Android应用程序)

  • 上述有关第二次创建Firestore的错误消息的常见原因是什么?是否有办法防止Firestore客户端关闭


  • 如果我创建Firestore实例

    FirestoreOptions firestoreOptions = FirestoreOptions.newBuilder()
                                           .setCredentials(myCredentials)
                                           .setProjectId("myFirestoreProject")
                                           .build();
                           
               
    Firestore db = firestoreOptions.getService();
    

    ,安全规则被绕过,在写入所有数据之前,此实例不会关闭。

    要回答您的第一个问题,如中的注释所述:

    “服务器客户端库绕过所有云Firestore安全规则,而是通过Google应用程序默认凭据进行身份验证。如果您正在使用服务器客户端库或REST或RPC API,请确保为云Firestore设置标识和访问管理(IAM)。”

    因此,这些规则只适用于客户端。您可以通过拒绝所有客户端访问

    至于第二个问题,请检查您的代码是否多次初始化或关闭数据库,并确保它遵循中的示例

    FirestoreOptions firestoreOptions = FirestoreOptions.newBuilder()
                                           .setCredentials(myCredentials)
                                           .setProjectId("myFirestoreProject")
                                           .build();
                           
               
    Firestore db = firestoreOptions.getService();