0

저는 몇 국가와 도시가있는 간단한 Firestore 데이터베이스를 가지고 있습니다. 각 국가마다 문서 즉 프랑스를 생각해보십시오. 두 가지 시나리오에 대한 PERMISSION_DENIED 예외를 직면하는 요청 변수를 사용하여 문서를 읽는 중. 참조 용Cloud Firestore - 요청 변수가 예상대로 작동하지 않습니다.

공유 다음 사항 1) 경우 FireStore 구성 2) 다음 호출 할 4) 방법을 만들 경우 FireStore 데이터베이스를 읽을 각 실패 3) 클래스 파일을 3) 관련 로그를 작동하지 않는 특정 구성 시나리오

시나리오 1 - 작동해야이 권한을 다음 중 적어도 하나,하지만 그들 중 어느 쪽도

allow read : if request.resource.__name__ != null ; 
allow read : if request.resource.__name__ == null ; 
0,123,414을하고있다 오류 로그

I/System.out에 : firestoreTest ACTION_READ onFailureListener 전자 = 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 - 아니 문제, 그리고 잘 작동. FireStoreTest.firestoreTest 액션 = [2], 국가 = [프랑스], hashmapCountry는 = [널 (null) : 유사한 시나리오 2

allow read : if resource.__name__ == /databases/$(database)/documents/Countries/france ; 

오류 로그 I/System.out에

작동하지 않기 때문에 만 발표 ] I/시스템.아웃 : 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 가지 시나리오

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

} 

} 위의 모든 테스트하는 데 사용됩니다 모든 다음 3 시나리오 클래스 아래

fireStoreTest.firestoreTest(fireStoreTest.ACTION_READ,"france",null); 

을 테스트하는 데 사용할 수 있습니다

답변

0

문제가 request.resource의 사용에있다 중포 기지 지원에서 응답 아래 받았습니다. our documentation에서 언급했듯이 request.resource (및 request.resource. 이름 인 및 request.resource.data.city와 같은 모든 변수는 쓰기 작업에는 사용되지만 읽기 작업에는 사용되지 않습니다.

관련 문제