Cloud Firestore - 请求变量未按预期工作
我有一个简单的Firestore数据库,只有少数国家和每个国家/地区的城市。考虑每个国家的文件,即法国。同时使用请求变量读取文档面临PERMISSION_DENIED异常以下两种情况。Cloud Firestore - 请求变量未按预期工作
,供大家参考分享以下几点 1)公司的FireStore配置 2),这是不工作 3)相关日志每次失败 3)类文件创建和读取公司的FireStore数据库 4)方法调用下面的具体配置场景
方案1 - 2之后应许可工作中的至少一种,但两者都没有工作
allow read : if request.resource.__name__ != null ;
allow read : if request.resource.__name__ == null ;
错误日志
I/System.out的:firestoreTest ACTION_READ onFailureListener E = com.google.firebase.firestore.FirebaseFirestoreException:PERMISSION_DENIED:缺少或权限不足。 I/System.out的:firestoreTest getOnCompleteListener不成功
方案2 - 尽管文件名 '法国' 在数据库中存在,它不工作。
allow read : if request.resource.__name__ == /databases/$(database)/documents/Countries/france ;
错误日志
I/System.out的:FireStoreTest.firestoreTest动作= [2],国= [法国],hashmapCountry = [零] I/System.out的:firestoreTest ACTION_READ onFailureListener e = com.google.firebase.firestore.FirebaseFirestoreException:PERMISSION_DENIED:权限缺失或不足。 I/System.out的:firestoreTest getOnCompleteListener不成功
方案3 - 没有问题,而且运作良好。只有提出,因为类似的情景2不工作
allow read : if resource.__name__ == /databases/$(database)/documents/Countries/france ;
错误日志
I/System.out的:FireStoreTest.firestoreTest行动= [2],国= [法国],hashmapCountry = [空] I/System。出:firestoreTest getOnCompleteListener成功{城市=巴黎}
基本配置测试场景
service cloud.firestore {
match /databases/{database}/documents
{
match /Countries/{country}
{
allow write : if true ;
allow read : // replace as per below scenario
}
}
}
}
方法来创建集合,仅需要被称为试验前一次
HashMap<String, String > hashMap = new HashMap<>() ;
hashMap.put("city","paris") ;
fireStoreTest.firestoreTest(fireStoreTest.ACTION_ADD,"france",hashMap);
方法可用于测试所有以下3场景
fireStoreTest.firestoreTest(fireStoreTest.ACTION_READ,"france",null);
下面类是用来测试上述3个场景
package com.firestoreTest ;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import java.util.HashMap;
import java.util.Map;
public class FireStoreTest {
public static final int ACTION_ADD = 1 ;
public static final int ACTION_READ = 2 ;
private FirebaseFirestore firebaseFirestore ;
public FireStoreTest() {
firebaseFirestore = FirebaseFirestore.getInstance() ;
}
public void firestoreTest(int action, String country, HashMap hashmapCountry)
{
System.out.println("FireStoreTest.firestoreTest action = [" + action + "], country = [" + country + "], hashmapCountry = [" + hashmapCountry + "]");
DocumentReference documentReference = firebaseFirestore.collection("Countries").document(country) ;
switch (action)
{
case ACTION_ADD:
documentReference.set(hashmapCountry)
.addOnFailureListener(e-> System.out.println("firestoreTest ACTION_ADD onFailureListener e = "+e) )
.addOnCompleteListener(task -> {
if (task.isSuccessful())
{
System.out.println("firestoreTest setOnCompleteListener Successful ");
} else
{
System.out.println("firestoreTest setOnCompleteListener Unsuccessful " +task.getException());
}
}) ;
break ;
case ACTION_READ:
documentReference.get()
.addOnFailureListener(e-> System.out.println("firestoreTest ACTION_READ onFailureListener e = "+e))
.addOnCompleteListener(taskDocumentSnapshot->{
if (taskDocumentSnapshot.isSuccessful())
{
DocumentSnapshot documentSnapshot = taskDocumentSnapshot.getResult() ;
if (documentSnapshot.exists())
{
Map mapDocumentSnapshot = documentSnapshot.getData() ;
System.out.println("firestoreTest getOnCompleteListener Successful "+mapDocumentSnapshot);
} else
{
System.out.println("firestoreTest getOnCompleteListener no data found ");
}
} else
{
System.out.println("firestoreTest getOnCompleteListener Unsuccessful ");
}
}) ;
break ;
}
}
}所有
收到的响应来自Firebase支持
问题出在使用request.resource。如our documentation所述,request.resource(及其所有变量,如request.resource。名称和request.resource.data.city)用于写入操作,但不用于读取操作。