安全规则:检查 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() 函数三次。这将使向前推进的变化更容易处理。