首页 > 解决方案 > Firestore 安全规则违反更新规则

问题描述

我昨天发布了一个关于这个的问题,但我正在创建一个包含更多细节的新问题。 Firestore .setData 被未创建的更新规则阻止

我已经运行了模拟器并且规则在那里工作。此外,当我创建文档并将setDataswift 代码更改update为代码有效时。它似乎只在创建文档时失败。但问题是,当我删除update规则或只是将其更改为allow update: if false; setData(或视为由规则创建)时,会正确执行。我不知道发生了什么,也不知道有什么工具可以更好地了解情况。

 match /users_real/{userID} {
    allow create: if true;
    allow read: if isOwner(userID);
    allow update: if (request.writeFields.size() == 1);

}

设置数据:

self.docRef.collection("users_real").document("adfadsf").setData(post) { (error) in

            if let error = error {
                print("He dead!: \(error.localizedDescription)")


            }
            else {
                print("it worked, for now")


            }
        }

标签: swiftfirebasegoogle-cloud-firestorefirebase-security

解决方案


Firebase 支持确认存在与request.writeFields.size(). 没有估计何时修复。

可以通过以下规则证明 bug 的存在:

service cloud.firestore {
  match /databases/{database}/documents {

    match /cities/{city} {
      // This should always evaluate to true, but does not.
      allow create: if (request.writeFields.size() == 1) || (request.writeFields.size() != 1);
      allow update: if true;
    }
  }
}

尽管该create规则应始终评估为 true,但创建城市的尝试失败并显示 Permission Denied。似乎问题request.writeFields不仅影响它出现的规则,还影响路径的其他规则。对于上面显示的规则,更新现有城市的尝试也会因 Permission Denied 而失败。


推荐阅读