实时数据库安全规则无法在根目录上访问

时间:2019-09-21 17:21:56

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

我们有一个基本的云存储应用程序,现在支持共享文件。但是,在编写规则时,我遇到了一个问题:

使用通配符$ file,可以使用JS控制台将一个可以访问的文件夹加载到一个节点(节点)中,但是当尝试访问根文件目录时,它不会加载任何文件,而不是加载节点一个可以访问。问题在于,根目录上没有读写规则,而呈现功能需要获取该目录的值,然后将文件加载到目录中。

我想知道是否有一种方法可以获取目录的值,以返回仅包含一个人可以访问的文件的值?

我的意思是:

firebase.database().ref('/shared-files/shared/files/').on('value', (snapshot) => {
alert(snapshot.val())
})

会向json警告您有权访问的文件,但不包括那些您没有权限的文件。 共享文件的当前规则如下,共享文件的根目录位于/ shared-files / shared / files /

    "shared-files": {
      "shared": {
        "files": {
          "$file": {
                ".read":"root.child('shared-files').child('shared').child('files').child($file).child('users').hasChild(auth.token.email.replace('@forcloud.app',''))",
                ".write":"(root.child('shared-files').child('shared').child('files').child($file).child('users').hasChild(auth.token.email.replace('@forcloud.app',''))) || newData.exists()"
            }
        }
      }
    }

1 个答案:

答案 0 :(得分:0)

似乎您希望将/ shared-files / shared / files下的子级过滤为仅用户有权访问的特定子级。您现在做的方式是不可能的。 Security rules are not filters。如果将拒绝任何子级访问,则整个读取将失败。

您要做的是组织数据,以使客户端可以根据规则中的逻辑仅查询他们知道应该访问的项目。客户端过滤器必须匹配安全规则应用的限制。