【问题标题】:How to read a document in Firebase security rules?如何阅读 Firebase 安全规则中的文档?
【发布时间】:2021-12-29 02:16:17
【问题描述】:

我正在尝试在模拟器上针对某些 firebase 安全规则运行测试,但是在运行它时,资源始终显示为 null,并且永远不会针对底层的允许写入运行测试。这是我的安全规则代码:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
  
    match /{document=**} {
      allow read, write: if isSignedIn(); // only if user is signed in are they allow to do any operation
      
      match /{spaceId} { // Any space: not reading or writing allowed to those docs
            allow read, write: if false;
        }
        match /{spaceId}/posts/{postId} { // any post
            allow read; 
        allow write: if resource.user.uid == request.auth.uid;
        }
    }

【问题讨论】:

    标签: firebase react-native google-cloud-firestore firebase-security


    【解决方案1】:

    match /{document=**} 表示您正在为此集合及其下的所有文档定义规则。因此,检查isSignedIn 的顶级allow 规则也适用于所有子集合。并且由于规则是ORed 在一起的,这意味着任何登录的用户也可以读/写spaceid 文档。

    要使匹配仅适用于它自己的集合,请从中删除 =**

    【讨论】:

      【解决方案2】:

      Frank 有权利在规则中存在漏洞。我敢肯定,规则就像在 css 代码中一样工作。首先限制对所有数据的访问,然后允许任何人做任何事情。

      在下面的例子中,用户只能在用户和应用集合中做一些事情。

      match /databases/{database}/documents {
          match /{document=**} {
            allow read, write: if false;
          }
          match /users/{userId} {
              allow create: if (isLoggedIn() && !userExist()) || isAdmin());
              allow read, update: if isOwner(userId) || isAdmin());
          }
          match /app/{data} {
              allow write: if isEditor();
              allow read: if true;
          }
      }
      

      您的问题的解决方案是resource.data.user.uid,您在资源之后错过了数据。请记住,如果您创建文档写入操作是创建和更新,则将没有资源。更新将起作用,但无法创建。

      【讨论】:

      • 感谢您的更正。所以之后,我尝试做一个allow delete: if (resource.data.user.uid == request.auth.uid) 但是,我得到了“属性用户未在对象上定义”,尽管我检查了路径和文档确实存在。
      • @Andy 您的if 语句要求已经存在包含 user.uid 字段的文档。
      • 我不知道您在做什么,但我确定您是否只想拥有此声明,必须有人创建文档,并且必须使用 admin sdk 作为后端。您可以使用 firebase 功能。看看我的用户集合示例。用户只有在不存在且请求数据 id 等于用户 uid 的情况下才能创建文档。
      • 好的,我了解 firebase 功能,那么您尝试引用的文档是否必须存在于您的 Firebase Emulator Firestore 中,或者由于我链接了我现有的 firestore 项目,它是否可以访问?出于某种原因,访问现有文档的数据会给我这个错误。如果您可以参考我的其他问题link,我将不胜感激。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2020-06-19
      • 2021-10-25
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      相关资源
      最近更新 更多