【问题标题】:Firebase security rules with wildcards带有通配符的 Firebase 安全规则
【发布时间】:2016-10-12 21:52:26
【问题描述】:

我有一个这样的数据结构:

如何在 Firebase 安全规则中访问 /Restaurant/-KK37k6g5cYYippEHpZ3/User/-KK37k6g5cYYippEHpZ4/id 的值?两个按键应该是通配符。我需要这样的东西:

"Restaurant": {
        "$id": {
            ".read": "auth.uid != null",
            ".write": "data.child($id).child('User').child($anotherWildcard).child('id').val() === auth.uid"  
        }
    }

【问题讨论】:

  • 如果你能给我们一些关于你试图实现的逻辑的背景知识,那就太好了。让我猜猜。如果用户在这家餐厅有订单,您是否试图确保他对餐厅有写访问权?还是您只想为用户订单授予写入权限?
  • 对不起,我的错误,改变了上面的查询。用户具有与订单相同的结构。我只想向属于这家餐厅的用户授予写入权限。
  • srry 但现在我更困惑了。为什么你会在一个用户中有 2 个 id?你为什么要restaurantId/User/id/id?那 2 个 id 是什么?
  • 您在问题中包含了 JSON 树的图片。请将其替换为作为文本的实际 JSON,您可以通过单击 Firebase 数据库中的“导出”按钮轻松获取该文本。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。
  • 嘿@dabo,如果我的答案不清楚或者您还有其他问题,请告诉我。谢谢!

标签: firebase firebase-security firebase-authentication


【解决方案1】:

不确定我是否完全理解您的要求,但这是我的想法。

您的规则中的第一个问题是您指定了child($id),但您已经在$id 内。您所指的$id 隐含在您的data 中。

要解决您的主要问题,您不需要另一个通配符。您可以只使用hasChild 来验证auth.uid 是否在restaurant/user 中。

"Restaurant": {
   "$id": {
      ".read": "auth.uid != null",
      ".write": "auth.uid != null && data.child('User').hasChild(auth.uid)"
   }
}

【讨论】:

  • 在重构我的数据结构后,.hasChild() 为我做了,谢谢!
  • 之前的问题是,data.child('User') 没有将 UserID 作为直接子级,而是在中间嵌套了 PushID。一家餐厅可以有多个用户。
  • 我有类似的问题,但似乎无法让它工作。 (我无法匹配通配符$id)请您看看:stackoverflow.com/questions/44888876/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 2016-07-02
  • 2016-08-19
  • 2021-01-24
相关资源
最近更新 更多