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

时间:2018-08-30 10:00:37

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

我刚接触Firebase,感到自己完全被数据库规则迷住了。我需要允许用户读取所有者字段等于特定值的项目。

这是我拥有的记录结构:

{
  "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); 

请告知可能出什么问题。 谢谢。

3 个答案:

答案 0 :(得分:2)

实际上“ Firebase规则不是过滤器”,请参见https://firebase.google.com/docs/database/security/securing-data#rules_are_not_filters

这意味着,要获取此数据,您必须使用与您的安全规则“对齐”的查询。

类似于JavaScript中的以下内容,请参见https://firebase.google.com/docs/database/web/lists-of-data

var query = firebase.database().ref('books').orderByChild('owner').equalTo('umV4hFm96vpdwBytx63');

答案 1 :(得分:1)

根据@AndréKool的建议,这就是我解决此问题的方法: 为了过滤响应项,我使用了query based security rule

{ 
  "rules": { 
      "books": { 
          ".read": "query.orderByChild == 'owner' && query.equalTo == auth.uid", 
          ".write": "auth != null" 
        } 
     } 
  }

我相应地使用了js过滤:

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

感谢大家的帮助! ;-)

答案 2 :(得分:0)

尝试:

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