java - 服务器端访问 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 实例之间差异的混淆让我想到了两个问题:
如果我使用我最初创建的 Firestore,我是否可以设置安全规则以授予此 Firestore 实例写入权限,同时阻止任何客户端写入访问 - 例如来自 Android 应用程序?
上述关于第二次创建 Firestore 的错误消息的常见原因是什么,有没有办法阻止 Firestore 客户端关闭?
解决方案
如果我通过以下方式创建 Firestore 实例
FirestoreOptions firestoreOptions = FirestoreOptions.newBuilder()
.setCredentials(myCredentials)
.setProjectId("myFirestoreProject")
.build();
Firestore db = firestoreOptions.getService();
,安全规则被绕过,并且这个实例在所有数据都被写入之前不会关闭。
推荐阅读
- javascript - 渲染如何与分页点击状态同步?
- shell - 我自己的 shell 程序中的后台进程忽略标准输入
- javascript - 我的分页跳来跳去,我不知道如何解决它
- javascript - 使用数据库中的选项添加新的选择表单
- python - Flask,在视图之间传递用户输入的数据
- date - 将 YYYYMMDD8 转换为 DATE9 格式?
- c# - c#字典使用文本框从datagridview中选择索引
- prestashop - 如何使用 PrestaSharp 更新 PrestaShop 中的 product.quantity?
- c - 使用 printf 打印一个字符会导致什么都不显示
- r - 使用 facetwrap 的多个 Kmeans 聚类和绘图