Firebase 如何限制用户从Firestore文档中读取数据?

Firebase 如何限制用户从Firestore文档中读取数据?,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我的数据库结构如下所示: Firestore-root | --- users (collection) | | | --- UidOne (document) | | | --- userName: "UserOne" | --- items (collection) | --- ItemIdOne (document) | |

我的数据库结构如下所示:

Firestore-root
   |
   --- users (collection)
   |     |
   |     --- UidOne (document)
   |          |
   |          --- userName: "UserOne"
   |
   --- items (collection)
         |
         --- ItemIdOne (document)
         |     |
         |     --- itemName: "ItemOne"
         |
         --- ItemIdTwo
               |
               --- itemName: "ItemTwo"
我想要实现的是使用安全规则限制每个用户从
items
集合中的每个文档中读取项目名称。我就是这样做的:

service cloud.firestore {
    match /databases/{database}/documents {
        match /items/{item} {
            allow read, write: if false;
        }
    }
}
要显示项目名称,我使用以下查询:

Query query = itemsRef.orderBy("itemName", Query.Direction.ASCENDING);
当我尝试编译我的应用程序时,出现以下错误:

com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Missing or insufficient permissions.

但项目名称仍显示在my
RecyclerView
中。如何阻止这种情况发生?

可能需要检查您的项目是否仍然来自本地缓存

从第页将此添加到您的OneEvent

       String source = querySnapshot.getMetadata().isFromCache() ?
                    "local cache" : "server";
            Log.d(TAG, "Data fetched from " + source);
如果它正在从本地缓存读取,您可以这样设置PersistenceEnabled(false)(该页也提到):


即使您处于联机状态,它也将从本地快照读取数据,并且仅在数据更改时更新快照。是你的规则改变了你的数据。我发现当测试设置为true时,我得到了一些意想不到的结果。我发现在测试和更改代码/规则时,我更喜欢将其设置为false。

谢谢您的回答,但我始终在线。即使在线,它仍将从本地快照读取。很抱歉,我在火车上写这个答案时,我已经添加了代码和链接到Firestore页面。我希望这有帮助,你的规则在我看来很好,你得到了预期的许可被拒绝。
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(false)
        .build();
db.setFirestoreSettings(settings);