【问题标题】:Firebase database access rules by data key按数据键的 Firebase 数据库访问规则
【发布时间】:2018-09-21 21:40:52
【问题描述】:

我有以下类型的 Firebase 数据库数据:

{ sales: 
    { -Axyz: {shop_id: 1, name: item1},
      -BqwW: {shop_id: 2, name: item2},
      -Cwer: {shop_id: 1, name: item3}
    }
}

我正在使用身份验证令牌声明来存储访问级别和 ID。 我希望管理员可以访问所有记录,而店主只能访问他们的记录。

我有以下数据库规则 - 管理员用户可以访问所有记录,而商店用户可以访问他们自己的记录:

{
"rules": {
    "sales": {
        ".read": "auth.token.admin === true"
        "$key": {
            ".read": "auth.token.shop === true && data.child('shop_id').val() === auth.token.shop_id"
        }
    } 
} }

理想情况下,我想查询 /sales/ 表并获取相关记录的列表 - 管理员用户的所有记录和商店用户的一些记录。

        firebase.database().ref('sales').on('value', ....

这种方式可以实现吗?

谢谢!

【问题讨论】:

  • 您能否编辑问题以包含尝试读取数据但失败的代码?
  • 嗨,谢谢,我现在编辑了 Q 以更好地解释我想要实现的目标。
  • 您的"sales": { ".read": "auth.token.admin === true" 将向拥有admin 声明为true 的用户授予读取权限。如果此类用户运行您的代码firebase.database().ref('sales').on('value',则将允许读取。如果此读取被您拒绝,则用户没有正确的声明
  • 那么商店用户是否可以从 /sales/ 获取所有“他们的”记录的列表?
  • 虽然管理员可以阅读/sales,但其他用户无法从那里阅读。您可能希望 Firebase 自动过滤您有权访问的子节点,但遗憾的是并非如此。安全规则不会自动过滤数据(请参阅previous questions about this)。因此,虽然每个用户都可以访问他们商店的每个销售节点,但他们无法读取/sales 来获取它们的列表。 Query based rules 可能有用,但我不确定

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


【解决方案1】:

感谢 cmets 中的讨论,它现在对我有用。

我使用了https://firebase.google.com/docs/database/security/securing-data#query-based_rules 中描述的基于查询的规则

firebase.database().ref('sales') 
    .orderByChild('shop_id').equalTo(user.claims.shop_id) 
    .on('value' ...

仅返回此用户允许查看的值列表

【讨论】:

    猜你喜欢
    • 2018-12-15
    • 1970-01-01
    • 2020-08-20
    • 2017-07-15
    • 2017-06-08
    • 2017-02-21
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    相关资源
    最近更新 更多