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

时间:2018-04-24 18:45:10

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

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

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.

但项目名称仍显示在我的RecyclerView中。我怎样才能阻止这种情况发生?

1 个答案:

答案 0 :(得分:1)

也许检查您的商品是否仍然来自本地缓存。

this页面添加此内容到您的OnEvent

:: Q:\Test\2018\05\08\SO_50222677.cmd
@Echo off&SetLocal
Set /P "_FileName=FileName  :"
Set /P     "_Size=Size in pt:"
Set /P    "_Color=html color:"
Set /p     "_Name=Hello name:"

(   Echo:^<html^>^<body^>
    Echo:Hello 
    Echo:^</span^>%_NAME%
    Echo:
    Echo:^<p ^<span style='font-size:%_Size%pt'^>
    Echo:
    Echo:^<span style='color:%_Color%'^>
    Echo:
    Echo:^</span^>^</p^>^</body^>^</html^>"
) > "%_FileName%"

如果从本地缓存读取,您可以像这样设置PersistenceEnabled(false)(也在该页面上提到):

       String source = querySnapshot.getMetadata().isFromCache() ?
                    "local cache" : "server";
            Log.d(TAG, "Data fetched from " + source);

即使您在线,它也会从本地快照中读取,并且只有在数据发生变化时才会更新快照。您的规则不会改变您的数据。我发现在测试时设置为true我得到了一些意想不到的结果。我发现在测试和更改代码/规则时我更喜欢它是假的。