【问题标题】:Firestore security rules - if exists statementFirestore 安全规则 - 如果存在语句
【发布时间】:2020-02-01 15:36:25
【问题描述】:

我正在尝试为我的 Firestore 项目实施安全规则。这里的声明不起作用,谁能告诉我为什么?我现在一头雾水。

我想要实现的目标:如果该用户在用户列表中,则该用户只能读取该用户列表。

match /databases/{database}/documents {  

     match /groups/{group}/userlist/{document=**}{
        allow read: if exists(/databases/$(database)/groups/$(group)/userlist/$(request.auth.uid));

     //for troubleshooting: the general rule below works fine and access is granted 
     //allow read :if request.auth.uid != null;

    }
  }

这是来自我的应用程序的代码示例,其中未授予使用所述语句的访问权限。正如我在“规则”代码中的注释行中所说:当我将规则设置为更一般的访问条件时,我会得到结果。

以下代码来自适配器中的 onBind。为了确定,我添加了一行打印 uid。

System.out.println("UserId: "+ mAuth.getCurrentUser().getUid());

db.collection("groups").document(model.getGroupId()).collection("userlist").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {

                int members = queryDocumentSnapshots.size();
                holder.mPreviewText.setText("Number of Members: " + members);
            }
        });

I/System.out: UserId: iWBdGRNmJCOEtXWKefeD2T7cH1l2
I/System.out: UserId: iWBdGRNmJCOEtXWKefeD2T7cH1l2
I/System.out: UserId: iWBdGRNmJCOEtXWKefeD2T7cH1l2
I/System.out: 1
I/System.out: UserId: iWBdGRNmJCOEtXWKefeD2T7cH1l2
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/uaRV4n21PWov5p6VPlYH/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
I/System.out: UserId: iWBdGRNmJCOEtXWKefeD2T7cH1l2
I/System.out: UserId: iWBdGRNmJCOEtXWKefeD2T7cH1l2
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/tqsFIMhaMdZUfx6M3Guz/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
I/System.out: UserId: iWBdGRNmJCOEtXWKefeD2T7cH1l2
I/System.out: UserId: iWBdGRNmJCOEtXWKefeD2T7cH1l2
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/tm09NSiqZ5rDaBZzH52g/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/iye5A0JaltId8xYeQLie/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/cnj4BOMHY0LlXb7KJsW0/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/UGmozZfEOKXX1sajT1NW/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/S4lJIyAMfDtQUTS08PWa/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/uaRV4n21PWov5p6VPlYH/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/tqsFIMhaMdZUfx6M3Guz/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}

我阅读了所有文档,这就是我认为代码应该看起来的样子,但它不起作用,列表中的用户没有读取权限。

Query(target=Query(groups/uaRV4n21PWov5p6VPlYH/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}

【问题讨论】:

  • "此语句不起作用" 您能否编辑您的问题以显示您运行的不违反这些规则的最小、完整代码?鉴于您正在检查另一个文档是否存在,查看您正在检查的文档的屏幕截图也会很有帮助。
  • 不确定你想看什么截图。控制台内的文档?
  • 我们无法确定 1) 用户使用 UID 登录和 2) 具有 UID 的文档存在于正确的集合中。如果无法验证这些事实,我们将无法提供太多帮助,因为这些正是您的规则试图验证的内容。
  • 好的,但是代码本身没问题?我特别询问该代码对于我描述的目的是否正确,因为我不熟悉 Firebase 安全规则。但是我不需要帮助来检查我的数据库中是否存在文档......并且用户使用 uid 登录为“允许读取:如果 request.auth.uid != null”工作正常。
  • 感谢您提供额外的代码。乍一看,该代码看起来不错,所以我们现在只能说if exists(/databases/$(database)/groups/$(group)/userlist/$(request.auth.uid)) 确实似乎失败了。您将要检查该文档是否确实存在于控制台中。为了让我们帮助您进行仔细检查,请在您的问题中发布相关的屏幕截图。

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


【解决方案1】:

好的,我终于找到了我的错误。很抱歉打扰各位了。我在 if-exists-clause 中缺少“/documents/”。

正确方法:

match /databases/{database}/documents {  

     match /groups/{group}/userlist/{document=**}{
        allow read: if exists(/databases/$(database)/documents/groups/$(group)/userlist/$(request.auth.uid));

    }
  }

现在它可以工作了,一切都变得完美了。

【讨论】:

    猜你喜欢
    • 2022-12-11
    • 2020-08-22
    • 2019-09-27
    • 1970-01-01
    • 2018-10-19
    • 2019-07-05
    • 2020-07-03
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多