Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅读取特定项目的Firebase安全规则_Firebase_Firebase Realtime Database_Firebase Security - Fatal编程技术网

仅读取特定项目的Firebase安全规则

仅读取特定项目的Firebase安全规则,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我刚开始使用Firebase,觉得自己完全不懂DB规则。我需要允许用户读取所有者字段等于特定值的项目 这是我的记录结构: { "books" : { "-LKwbZsfy55d24kwX4tf" : { "description" : "Adventures", "title" : "Captain Donsak", "owner" : "b7bS753Hvc0fmQ24Jnc" }, "-LKwc1Xna07nequDtpF6"

我刚开始使用Firebase,觉得自己完全不懂DB规则。我需要允许用户读取所有者字段等于特定值的项目

这是我的记录结构:

{
  "books" : {
    "-LKwbZsfy55d24kwX4tf" : {
      "description" : "Adventures",
      "title" : "Captain Donsak",
      "owner" : "b7bS753Hvc0fmQ24Jnc"
    },
    "-LKwc1Xna07nequDtpF6" : {
      "description" : "History",
      "title" : "World War II",
      "owner" : "hLoOnnv4883Vhvm9Vt4"
    },
    "-LKwi4qcsqbgvZPdhCXp" : {
      "description" : "Adventures",
      "title" : "Sea Wolf",
      "owner" : "umV4hFm96vpdwBytx63"
    }
  }
}
我尝试了几种规则选项,包括以下(这些在firebase文档中提供),但在任何情况下,当我应用这些规则时,它都会返回0项

{
  "rules": {     
    "books": {
        ".read": "data.child('owner').val() === 'umV4hFm96vpdwBytx63'",
        ".write": "auth != null"   
    }
  }
}


{
  "rules": {     
    "books": {
      "$uid":{
        ".read": "root.child('owner').val() == 'umV4hFm96vpdwBytx63'",
        ".write": "auth != null"   
      }        
    }
  }
}
如果我能具体说明的话

".read": "auth != null"  
它返回所有记录,但这不是我需要的

我使用一个简单的js命令读取数据:

const itemsRef = firebase.database().ref('books'); 
基本上,我需要的是使用安全规则过滤数据,但正如RenaudTarnec下面所述,这是不可能的。所以我必须使用js来过滤它:

const itemsRef = firebase.database().ref('books').orderByChild('owner').equalTo(owner); 
请告知可能出现的问题。 谢谢。

试试看:

{
  "rules": {     
    "books": {
      ".read": "data.child('owner').val() === auth.uid",
      ".write": "auth != null"   
    }
  }
}
实际上,“Firebase规则不是过滤器”,请参见

这意味着,要获取这些数据,必须使用与安全规则“一致”的查询

与JavaScript中的以下内容类似,请参见


根据@AndréKool的建议,我就是这样解决这个问题的: 为了过滤响应项,我使用了:

我相应地使用js过滤:

const itemsRef=firebase.database().ref('books').orderByChild('owner').equalTo(owner)


谢谢大家的帮助!;-)

您的规则是检查所有者是否等于您的硬编码uiduse
auth.uid
,而不是
'umV4hFm96vpdwBytx63'
您能在问题中输入这些信息吗?并不是每个人都阅读评论,为了帮助我们,最好让你的问题尽可能完整:)@AndréKool,在我的问题中添加了这些信息。谢谢。我想你可能误解了这个问题(或者我误解了)。它清楚地说明了所有者需要“等于特定值”,而不是uid。明白了。另一个建议是:
data
是否意味着子
-lkwi4qcsqbgbgvzpdhcxp
或根
books
它不起作用,因为data意味着
books
没有名为
owner
的子级。是的,特定的owner值不是这里的关键。如果我的问题不够清楚,我道歉。主要问题是我想过滤记录并只返回那些与特定所有者(auth.uid或特定字符串)匹配的记录。这只能在js代码中完成,而不是通过安全规则。虽然这可能回答了这个问题,但我认为我们确实需要先查看代码的使用情况。乍一看,答案中的两条规则对我来说似乎都不正确(首先检查书籍的子项,而不是书籍/booID,第二检查根的子项)谢谢@Renaud Tarnec,这就是我真正想要的。基本上,我需要根据安全规则过滤数据。我在考虑js过滤,但它看起来不安全。我更喜欢在服务器上过滤记录,而不是在客户端。但如果这是唯一可能的方法,我会选择它。也许我必须重组我的记录,使它更安全。。。“我得想一想。”刘:我想如果你看一看@安德烈·库尔,谢谢你!基于查询的规则看起来很有希望。我会尝试一下,并给出结果。@Liu很高兴听到这个消息。如果你的解决方案与这里提供的不同,你会考虑把它作为一个答案,所以其他人也能从中受益吗?你可能会接受你自己的答案,因为它是与你的解决方案相对应的一个。我可以在2天内接受我自己的答案。我以后会接受的。再次感谢你。
var query = firebase.database().ref('books').orderByChild('owner').equalTo('umV4hFm96vpdwBytx63');
{ 
  "rules": { 
      "books": { 
          ".read": "query.orderByChild == 'owner' && query.equalTo == auth.uid", 
          ".write": "auth != null" 
        } 
     } 
  }