0

我有一个简单的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 ; 
    } 

} 

}所有

回答

0

收到的响应来自Firebase支持

问题出在使用request.resource。如our documentation所述,request.resource(及其所有变量,如request.resource。名称和request.resource.data.city)用于写入操作,但不用于读取操作。