首页 > 解决方案 > 如何将 Firebase 实时数据库项目限制为对象中存在的“用户”

问题描述

我有一个实时数据库,所有设置和工作。数据结构非常简单:

我的规则也超级简单:

{
   "rules": {
      ".read":"auth.uid != null",
      ".write":"auth.uid != null"
   }
}

问题(显然)是,当我强制用户进行身份验证时,这就是我所需要的,任何用户都可以访问数据库中的所有项目。

我想要的是一种将用户限制在某个项目上的方法。

就像是:

项目1

项目2

我可以存储这些数据,但我不确定如何构建我的规则来限制它。

我的实际 json 看起来像:

{
    "annotations": {
        "8df0309f-dc62-821e-dd65-f0ad46396937": {
            "author": "1OXVKN3Y5Z-11",
            "xfdf": "LONG STRING"
        }
    },
    "complete": false,
    "created_at": "2020-09-01T17:52:25.653Z",
    "field_values": {
        "field_name": {
            "name": "copy",
            "value": "TEsting",
            "widgetID": "e61e3abf-7cdd-7d07-daec-6c3d3a55d667"
        }
    },
    "stamp_count": 0
}

我计划实施的是:

{
    "annotations": {
        "8df0309f-dc62-821e-dd65-f0ad46396937": {
            "author": "1OXVKN3Y5Z-11",
            "xfdf": "LONG STRING"
        }
    },
    "complete": false,
    "created_at": "2020-09-01T17:52:25.653Z",
    "field_values": {
        "field_name": {
            "name": "copy",
            "value": "TEsting",
            "widgetID": "e61e3abf-7cdd-7d07-daec-6c3d3a55d667"
        }
    },
    "stamp_count": 0,
    "users": [ "CFX4I0PTM9-11", "CFX4I0PTM9-7"]
}

我实现了那个 json 结构,我该如何设置规则来支持?

标签: firebase-realtime-databasefirebase-security

解决方案


通过阅读您的问题和评论线程,我认为您的要求是:

如果用户的 UID 与该项目相关联,则允许用户访问该项目。

在这种情况下,您首先需要确保 UID 位于键中,因为您无法像建议的users数组所要求的那样跨多个值进行搜索。所以你最终会得到:

"items": {
  "item1": {
    ...
    "users": {
      "CFX4I0PTM9-11": true, 
      "CFX4I0PTM9-7": true
    }
  }
}

现在使用这种结构,您可以确保用户只能使用以下users规则更新其 UID 在地图中的项目:

{
  "rules": {
    "items": {
      "$itemid": {
        ".write": "data.child('users').child(auth.uid).exists()"
      }
    }
  }
}

要阅读特定项目,您可以使用类似的规则。这将允许用户在知道项目的完整路径以及他们的 UID 在users地图中时读取项目。

但是您将无法查询此结构,因为您只能对命名属性进行索引。有关这方面的更多信息,以及仍然实现您的用例的替代数据结构,请参阅 Firebase 查询,如果子项的子项包含值


推荐阅读