【问题标题】:How to set Firebase security rule for read operation when user reads his/her own profile data用户读取自己的个人资料数据时如何为读取操作设置 Firebase 安全规则
【发布时间】:2021-03-21 06:07:54
【问题描述】:

我正在开发一个 Flutter 应用并使用 Firebase 作为后端。在我的应用中,每个用户都需要注册才能使用该应用,并且用户的个人资料数据保存在 user_profile 集合中。

每个用户的个人资料数据都存储在集合中的单独文档中。 每个文档的文档 ID 等于用户首次注册时由 Firebase 身份验证创建的用户 ID。 我还将用户 ID 保存在每个文档中的一个字段(名为 uid)中,以及对应的用户。

对于安全部分,我希望每个用户只能阅读他/她自己的个人资料数据。我设置了以下规则:

// Rules for User Profile data
match /user_profile/{any} {
  allow read: if (request.auth != null) && 
                 (resource.data.uid == request.auth.uid) && 
                 exists(/databases/$(database)/documents/users/$(request.auth.uid));

如果我按照上面的例子设置我的规则是否正确? (1) 用户需要认证 (2) 传入请求中的uid需要与用户要阅读的对应文档中的uid字段相等。 (3) 请求中可用的uid的文档必须存在于对应的文档中

如果我让整个事情变得不必要地复杂,我无法清楚地告诉我。例如,规则 (1) 是否与规则 (2) 做同样的事情?虽然我有规则 (1) 和 (2),但它是否也增加了规则 (3) 的内容?

【问题讨论】:

  • 请编辑帖子以将其缩小到一个问题。这里有三个不同的问题,这在技术上与 Stack Overflow 无关,可以关闭。您可以通过针对规则运行客户端应用程序代码来确定规则的正确性,以查看它是否按您期望的方式工作。这不是我们可以真正帮助您解决的问题,如果您的代码无法按您期望的方式工作,请与您的客户端应用程序代码一起进行查询。
  • 这是一个问题。你让我更新它,我写了 2 个新问题。您似乎甚至没有阅读问题就写了相同的评论!
  • 这里我数了三个问题。 1)如果我按照上面的例子设置我的规则是否正确? 2) 规则 (1) 是否与规则 (2) 做同样的事情? 3)虽然我有规则(1)和(2),但它是否也增加了规则(3)?
  • 所有这些语句都相互关联。潜在的问题是相同的。应该如何为问题中定义的用例设置安全规则。
  • 规则本身不会做任何事情。它们仅在客户端代码进行查询时触发。如果没有看到您的查询,以及对这些规则应该做什么以及它们如何没有按照您期望的方式工作的解释,我们无能为力。同样,我们无法为您确定规则是否正确 - 您可以通过实际再次查询它们并检查结果是否符合您的预期来自行测试。

标签: firebase flutter google-cloud-firestore firebase-authentication firebase-security


【解决方案1】:

基于您问题中的以下要素:

  1. 用户的个人资料数据保存在user_profile 集合中
  2. 每个(用户的配置文件)文档的文档 ID 等于用户 ID
  3. 您希望每个用户只能阅读他/她自己的个人资料数据

以下 read 安全规则应该可以解决问题:

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

    // Match any document in the 'user_profile' collection
    match /user_profile/{userId} {
      allow read: if request.auth != null && request.auth.uid == userId;
      // ...
    }
  }
}

换句话说,由于每个(用户的配置文件)文档的文档 ID 等于 userId,因此您不需要在安全规则中使用包含 userId 的字段:通配符表达式 {userId}使userId 变量在规则中可用,请参阅doc

【讨论】:

  • 感谢您的回答。我明白你的意思。 exists(..) 函数呢..?它会在其他 2 条规则之上添加任何内容还是过时?
  • exists 方法检查文档是否存在。在您的特定情况下(如 anwser 顶部的三个点所示),您根本不需要使用此方法。如果与此安全规则匹配,则表示 Id = userID 的用户文档存在 => 因此您只需检查正在阅读它的用户是否是与文档 ID 对应的用户。
猜你喜欢
  • 2021-06-10
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2020-07-11
  • 2016-11-05
  • 1970-01-01
相关资源
最近更新 更多