获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

了解 Firebase 实时数据库安全规则

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

Firebase 实时数据库安全规则确定谁对您的数据库具有读写访问权限、数据的结构方式以及存在哪些索引。这些规则存在于 Firebase 服务器上,并始终自动执行。只有在您的规则允许的情况下,才会完成每个读写请求。默认情况下,您的规则不允许任何人访问您的数据库。这是为了保护您的数据库免受滥用,直到您有时间自定义规则或设置身份验证。

实时数据库安全规则具有类似 JavaScript 的语法,有四种类型:

规则类型
。读描述是否以及何时允许用户读取数据。
。写描述是否以及何时允许写入数据。
。证实定义格式正确的值的外观、是否具有子属性以及数据类型。
.indexOn指定要索引的子项以支持排序和查询。

实时数据库安全概述

Firebase 实时数据库提供了一整套用于管理应用安全性的工具。这些工具使验证您的用户、强制执行用户权限和验证输入变得容易。

与许多其他技术堆栈相比,基于 Firebase 的应用运行的客户端代码更多。因此,我们处理安全性的方式可能与您习惯的有所不同。

验证

保护您的应用程序的常见第一步是识别您的用户。这个过程称为身份验证。您可以使用Firebase 身份验证让用户登录您的应用。 Firebase 身份验证包括对 Google 和 Facebook 等常见身份验证方法的直接支持,以及电子邮件和密码登录、匿名登录等。

用户身份是一个重要的安全概念。不同的用户有不同的数据,有时他们有不同的能力。例如,在聊天应用程序中,每条消息都与创建它的用户相关联。用户也可以删除他们自己的消息,但不能删除其他用户发布的消息。

授权

识别您的用户只是安全的一部分。一旦您知道他们是谁,您就需要一种方法来控制他们对数据库中数据的访问。实时数据库安全规则允许您控制每个用户的访问。例如,这里有一组安全规则,允许任何人读取路径/foo/ ,但没有人可以写入:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

.read.write规则级联,因此此规则集授予对路径/foo/以及任何更深层路径(例如/foo/bar/baz )的任何数据的读取访问权限。请注意,数据库中较浅的.read.write规则会覆盖较深的规则,因此即使路径/foo/bar/baz的规则评估为 false,在此示例中仍将授予对/foo/bar/baz的读取访问权限。

实时数据库安全规则包括允许您引用其他路径、服务器端时间戳、身份验证信息等的内置变量和函数。下面是一个规则示例,该规则授予经过身份验证的用户对/users/<uid>/的写入权限,其中 <uid> 是通过 Firebase 身份验证获得的用户 ID。

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

数据验证

Firebase 实时数据库是无模式的。这使得在开发过程中更改内容变得很容易,但是一旦您的应用程序准备好分发,数据保持一致就很重要。规则语言包括一个.validate规则,它允许您使用用于.read.write规则的相同表达式应用验证逻辑。唯一的区别是验证规则不会级联,因此所有相关的验证规则必须评估为 true 才能允许写入。

这些规则强制写入/foo/的数据必须是少于 100 个字符的字符串:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

验证规则可以访问所有与.read.write规则相同的内置函数和变量。您可以使用这些来创建验证规则,以了解数据库中其他地方的数据、您的用户身份、服务器时间等等。

定义数据库索引

Firebase 实时数据库允许排序和查询数据。对于小数据量,数据库支持即席查询,所以开发时一般不需要索引。但是,在启动您的应用程序之前,为您必须确保它们随着您的应用程序增长而继续工作的任何查询指定索引非常重要。

使用.indexOn规则指定索引。这是一个示例索引声明,它将索引恐龙列表的高度和长度字段:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

下一步