仅读取特定项目的Firebase安全规则
我刚开始使用Firebase,觉得自己完全不懂DB规则。我需要允许用户读取所有者字段等于特定值的项目 这是我的记录结构:仅读取特定项目的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"
{
"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)代码>
谢谢大家的帮助!;-) 您的规则是检查所有者是否等于您的硬编码uiduseauth.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"
}
}
}