저는 몇 국가와 도시가있는 간단한 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);
을 테스트하는 데 사용할 수 있습니다