安全规则:检查 null auth
Security Rules: checking for null auth
对于每个安全规则,是否有必要始终检查 auth !== null?必须为每个子规则执行此操作似乎是多余的。
我检查了 Firebase 自己的 Firechat 安全规则,执行情况完全不一致。有些规则使用 auth.uid 但不检查 null auth.
如果 auth 为 null 并且在规则中使用 auth.uid 会怎样?
关于检查 auth !== null 的推荐做法是什么?
如果您希望数据仅限于任何经过身份验证的用户,您需要勾选 auth !== null
。
当您希望数据仅限于当前经过身份验证的用户时,您需要检查 auth.uid == $uid
。您不需要检查 auth == null && auth.uid != $uid
,因为如果 auth
变量为 null,auth.uid == $uid
的计算结果将为 false。但是您仍然可以将两者都包括在内以确保彻底。
所以本质上,auth != null
将数据限制为任何经过身份验证的用户,而 auth.uid != null
仅限于当前经过身份验证的单个用户。
现在了解一些课外信息。
使用Bolt compiler简化通用规则。
安全规则是灵活的,但它们在复制通用规则方面没有太多便利。为此,您可以使用 Bolt compiler.
The Bolt compiler 允许您创建类型并将它们分配给 Firebase 数据库中的路径。这些类型充当模式。您还可以创建抽象通用规则的函数。
我wrote a blog post on securing user data with Bolt。它介绍了使用 Bolt 中的类型和函数保护用户数据安全所需了解的内容。
isCurrentUser(uid) = auth != null && auth.uid == uid;
isAuthenticated() = auth != null
path /users/$uid {
read() = isAuthenticated() // any authenticated user can read
write() = isCurrentUser($uid);
}
在上面的示例中,我们重复使用了 isCurrentUser()
函数三次。这将使向前推进的变化更容易处理。