【问题标题】:Firestore Security Rules - How to restrict users to reading only specific documents?Firestore 安全规则 - 如何限制用户仅阅读特定文档?
【发布时间】:2019-05-29 21:15:24
【问题描述】:

我想在视图中显示有关用户的公共信息,但我不希望用户能够get()我的 /users/ 中的所有用户列表{userID}/public 集合。我知道我可以限制访问,以便只有 public 集合可见。但这也会让某人清理整个数据库以查看所有公共用户。

我可以使用什么样的规则来限制访问以便指定特定文档?例如:

db.collection('users').get()

会被拒绝。但是:

db.collection('users').doc('abc123').collection('public').get()

...会成功的。

【问题讨论】:

    标签: google-cloud-firestore firebase-security


    【解决方案1】:

    没有什么关于 /users/x 和 /users/x/public 之间的关系使得很难单独保护它们。它们是完全不同的集合,可以单独保护而不会发生冲突。唯一遇到问题的情况是您选择使用通常不使用的 glob 通配符。

    如果您没有为 /users 指定任何规则,则不允许访问。您的第一个请求的规则是不写任何规则。 (除非您希望用户阅读他们的个人文档,否则只需编写该规则,它仍然会阻止任何人获取用户列表。)

    您的第二个请求的规则可以通过以下方式为每个人启用:

    match /users/{uid}/public/{id} {
      allow read;
    }
    

    该规则不会立即对 /users 中的文档产生影响,因为它们与模式不匹配。任何其他匹配 /users/{uid} 的规则都不会因为同样的原因影响任何子集合 - 不匹配。

    【讨论】:

      【解决方案2】:

      我刚刚意识到我有点回答了我自己的问题。您可以只授予用户 public 子集合的读取权限,但阻止对特定 user 文档的访问。

      对于那些稍后在这里谷歌搜索的人来说,像这样:

      service cloud.firestore {
          match /databases/{database}/documents {
              match /users/{userID} {
                  allow read, write, delete: if isAdmin();
      
                  match /public/{publicID} {
                      allow read: if request.auth.uid != null;
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-03-03
        • 2021-01-05
        • 1970-01-01
        • 2020-08-21
        • 2020-06-19
        • 2018-10-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-19
        相关资源
        最近更新 更多