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
的读取访问权限,即使路径/foo/bar/baz
中的规则评估为 false。
实时数据库安全规则包括允许您引用其他路径、服务器端时间戳、身份验证信息等的内置变量和函数。下面是一个规则示例,该规则为经过身份验证的用户授予对/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"] } } }