首页 > 解决方案 > 服务器端访问 Firestore 和安全规则:Firestore 客户端已关闭

问题描述

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

GoogleCredentials myCredentials = GoogleCredentials.fromStream(new FileInputStream("/myPath/myCredentials.json"));  
    
FirestoreOptions firestoreOptions = FirestoreOptions.getDefaultInstance()
   .toBuilder()
   .setProjectId("myFirestoreProject")
   .setCredentials(myCredentials)
   .build();
Firestore db = firestoreOptions.getService();

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 实例是由

FirebaseOptions options = FirebaseOptions.builder()
   .setCredentials(myCredentials)
   .setDatabaseUrl("https://myFirestoreProject.firebaseio.com")
   .build();
        
FirebaseApp app = FirebaseApp.initializeApp(options, "myFirestoreApp");
Firestore db = FirestoreClient.getFirestore(app);

现在,当我像这样创建数据库并运行我的更新代码时,我收到错误消息

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>>

对这两个 Firestore 实例之间差异的混淆让我想到了两个问题:

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

  2. 上述关于第二次创建 Firestore 的错误消息的常见原因是什么,有没有办法阻止 Firestore 客户端关闭?

标签: javagoogle-cloud-firestorefirebase-securityserver-side

解决方案


如果我通过以下方式创建 Firestore 实例

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

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


推荐阅读