【问题标题】:Cloud Firestore - request variable not working as expectedCloud Firestore - 请求变量未按预期工作
【发布时间】:2018-04-24 11:26:46
【问题描述】:

我有一个简单的 Firestore 数据库,其中包含几个国家/地区,每个国家/地区都有一个城市。将每个国家视为一个文件,即法国。使用请求变量读取文档时面临以下 2 种情况的 PERMISSION_DENIED 异常。

分享以下内容供您参考 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 action = [2],country = [france],hashmapCountry = [null] 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 action = [2],country = [france],hashmapCountry = [null] I/System.out: firestoreTest getOnCompleteListener 成功{city=paris}


测试场景的基本配置

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

}

}

【问题讨论】:

    标签: android firebase firebase-security google-cloud-firestore


    【解决方案1】:

    收到以下来自 Firebase 支持的回复

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

    【讨论】:

      猜你喜欢
      • 2015-04-11
      • 2018-04-24
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 2018-08-12
      • 2018-01-08
      • 2014-11-12
      • 2018-05-14
      相关资源
      最近更新 更多