如何为已知路径指定读取访问权限但禁用Firebase数据库中的枚举?

时间:2016-06-08 10:42:47

标签: firebase firebase-realtime-database firebase-security

我想在Firebase中指定规则,以便只有知道路径才能访问。

/root
  /messages
    /message1
    /message2
    /message3

如果您访问/消息,您可以收到拒绝(或没有)的权限。

如果您明确访问/ messages / message2,则会获得内容。

更新1:预期行为(iOS)

FIRDatabase   。数据库()   。参考()   .child("邀请&#34)   .observeEventType(.Value,withBlock:{snapshot in

//快照不返回任何内容或拒绝权限。 })

FIRDatabase
  .database()
  .reference()
  .child("invitations/message1")
  .observeEventType(.Value, withBlock: { snapshot in

  // snapshot returns message1
})

2 个答案:

答案 0 :(得分:3)

这不是答案,但我相信OP正在询问如何防止给定节点下的节点枚举,同时如果用户知道给定节点的DIRECT路径则允许匿名访问。

我也一直试图弄清楚如何做到这一点。基本上,我试图在给定节点下发布半敏感数据,同时通过不同方式安全地提供节点名称。但是,我不想在Firebase中实现“安全/用户”模型。我只想使用类似于Amazon S3存储桶的Firebase,如果您知道密钥的位置,则可以下载存储在该位置的文件/数据,同时仍然阻止数据库中节点的枚举/列表。

此类用法的一个示例是,如果使用加密摘要(如SHA2)生成密钥名称。密钥无法轻松生成,但如果您知道密钥,则可以直接访问该节点。有谁知道怎么做?

编辑:我想出了如何在Firebase中执行此操作。解决方案相当简单。以下是Firebase中JSON安全规则的示例:

{
    "rules": {
        "users" : {
          ".read": false,
          ".write": false,
          "$child" : {
            ".read" : true,
            ".write" : true
          }
        },
        "chats" : {
          ".read" : false,
          ".write" : false,
          "$child" : {
            ".read" : true,
            ".write" : true,
          },
        },
        "comments" : {
          ".read" : false,
          ".write" : false,
          "$child" : {
            ".read" : true,
            ".write" : true
          },
        },
        ".read": false,
        ".write": false
    }
}

在此示例中,“users”,“chats”和“comments”下的任何节点都可以直接访问,但枚举不再可能。

答案 1 :(得分:1)

您需要在消息ID级别内指定访问权限。

如果你清楚自己想要实现什么,它将如下所示:

{
  "rules": {
    "messages": {
      //if you add the read permission here it will give you access to all messages
      "$message": {
        //here it will give only to the specific $message.
        //if you want to specify the exctly message id you can do something like "$message == 'message1'" on the ".read"
        ".write": "auth != null",
        ".read": "auth != null"
      }
    }
  }
}