如何允许从组中读取特定项目但阻止列出组成员

通常的做法是通过创建项目 ID 为键的简单值节点来创建项目组。例如,我们可以通过在 /administrators/$user_id 创建一个值为 true 的节点,将用户添加到管理员组。出于安全原因,我们不希望任何人知道管理员是谁,但我们仍然想检查 Authenticated 用户是否是管理员。有了这些规则,我们可以这样做:

{
  "rules": {
    "administrators": {
      // No one can list administrators
      ".read": "false",
      "$uid": {
        // Authenticated user can check if they are in this group
        ".read": "$uid === auth.uid",
        // Administrators can write
        ".write": "data.parent().child(auth.uid).val() === true",
        // Allow only add or delete, no duplicates
        ".validate": "!data.exists() || !newData.exists() || newData.isBoolean()",
      }
    }
  }
}