【问题标题】:Realtime Database Security Rules no access on root directoy实时数据库安全规则无法访问根目录
【发布时间】:2019-09-22 15:47:53
【问题描述】:

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

使用通配符 $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()"
            }
        }
      }
    }

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的快速回答!使用基于查询的规则有用吗?
    • 我不确定你在问什么。我建议首先阅读该文档的链接。
    • 是的,我在文档中找到了一个部分,它说基于查询的规则,这似乎是我正在寻找的内容
    猜你喜欢
    • 2020-10-19
    • 2018-12-15
    • 2018-08-27
    • 2020-08-08
    • 2021-01-14
    • 2021-06-20
    • 2020-12-28
    • 2021-10-26
    相关资源
    最近更新 更多