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