【问题标题】:query.startAt database rule permission deniedquery.startAt 数据库规则权限被拒绝
【发布时间】:2020-04-13 12:21:41
【问题描述】:

似乎query.startAt 规则被破坏,或者我不明白。有人可以确认吗?这是最小的可重现错误。 Live example;使用 CTRL+SHIFT+i 打开 Chrome 控制台。 GitHub repo.

database.rules.json:

{
 "rules":{
  ".read": "query.startAt>0",
  ".write": false
 }
}

index.html

<!DOCTYPE html>
<html>
<body>
 <script src="/__/firebase/7.6.1/firebase-app.js"></script>
 <script src="/__/firebase/7.6.1/firebase-database.js"></script>
 <script src="/__/firebase/init.js"></script>
 <script>
  function init(){
   firebase.database.enableLogging(true);
   const db=firebase.database();
   const qry=db.ref("/").orderByChild('time').startAt(3);
   //logging shows permission denied on next line
   qry.once('value',s=>console.log("snapshot",s.val()));
  }

  init();
 </script>
</body>
</html>

数据库内容:

Chrome 浏览器控制台输出显示权限被拒绝:

...snip...
@firebase/database: p:0: Listen on / for {"i":"time","sp":3} 
@firebase/database: p:0: {"r":2,"a":"q","b":{"p":"/","q":{"sp":3,"i":"time"},"t":1,"h":""}} 
...snip...
@firebase/database: p:0: from server: {"r":2,"b":{"s":"permission_denied","d":"Permission denied"}} 
@firebase/database: p:0: listen response {"s":"permission_denied","d":"Permission denied"} 
@firebase/database: event: /:cancel

如果database.rules.json改为:

{
 "rules":{
  ".read": true,
  ".write": false
 }
}

监听的权限拒绝从浏览器控制台消失:

...snip...
@firebase/database: p:0: Listen on / for {"i":"time","sp":3} 
@firebase/database: p:0: {"r":2,"a":"q","b":{"p":"/","q":{"sp":3,"i":"time"},"t":1,"h":""}} 
...snip...
@firebase/database: p:0: handleServerMessage d {"p":"","d":{"msg1":{"time":11}}} 
@firebase/database: event: /:value:{"msg1":{"time":11}} 
01:45:21.044 (index):13 snapshot {"msg1":{"time":11}}
@firebase/database: p:0: from server: {"r":2,"b":{"s":"ok","d":{"w":["no_index"]}}} 
...snip...

这是从一个更大的应用程序中减少的,它在登录用户中体现出来。

【问题讨论】:

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


    【解决方案1】:

    firebaser 在这里

    我可以重现此问题,并且据我所知,您的规则看起来不错。

    在我的测试中,当使用query.startAt == 3 规则正确地允许读取,但使用&gt;&gt;= 规则拒绝读取操作。

    您能否file a bug report 看看这是否是规则模块中的错误,或者我们是否都遗漏了您的规则?


    更新:问题似乎来自对规则引擎中类型的误解。例如,当您确保所有数字都是浮点数时,它可以工作:

    ".read": "query.startAt > 0.5",
    

    还有:

    ref.orderByChild("time").startAt(2.5);
    

    请注意,这只是故障排除的一部分,并不是一个解决方案,尽管它可以让您暂时解决问题。

    【讨论】:

    • 我什至不知道您可以按查询过滤。每天学习新东西。
    • 按要求提交报告
    • 2022 年这个问题似乎仍然存在,有错误报告的链接吗? firebase 团队有任何反馈吗?提前致谢。
    • @B12Toaster 我不记得他们回复我说“这是固定的”,所以可能不是。如果有诸如规则引擎之类的公共错误板(而不是 Github 上的 sdks),我将不胜感激。不过,弗兰克的解决方法确实对我有所帮助,因为它可以用于显式转换为接近整数的浮点数。
    • 感谢@ChrisChiasson 的回复。我也不知道有任何用于 Firebase Realtime db 的公共 bugboard。但是,您是对的,Frank 的解决方法现在解决了这个问题。非常感谢你们的意见!
    猜你喜欢
    • 1970-01-01
    • 2021-05-25
    • 2018-02-20
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2020-12-29
    • 2020-10-16
    • 2019-03-10
    相关资源
    最近更新 更多