按数据键列出的Firebase数据库访问规则

按数据键列出的Firebase数据库访问规则,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我拥有以下类型的Firebase数据库数据: { sales: { -Axyz: {shop_id: 1, name: item1}, -BqwW: {shop_id: 2, name: item2}, -Cwer: {shop_id: 1, name: item3} } } 我使用auth令牌声明来存储访问级别和ID。 我想让管理员有权访问所有记录和店主有权只访问他们的记录 我有以下数据库规则-管理员用户可以访问所有记录,商店用户可以访问自己的记录:

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

{ sales: 
    { -Axyz: {shop_id: 1, name: item1},
      -BqwW: {shop_id: 2, name: item2},
      -Cwer: {shop_id: 1, name: item3}
    }
}
我使用auth令牌声明来存储访问级别和ID。 我想让管理员有权访问所有记录和店主有权只访问他们的记录

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

{
"rules": {
    "sales": {
        ".read": "auth.token.admin === true"
        "$key": {
            ".read": "auth.token.shop === true && data.child('shop_id').val() === auth.token.shop_id"
        }
    } 
} }
理想情况下,我希望查询/sales/table并获得相关记录的列表——所有记录都是管理员用户的,一些记录是商店用户的

        firebase.database().ref('sales').on('value', ....
有可能以这种方式实施吗


谢谢大家!

感谢评论中的讨论,现在对我有用了

我使用了在中描述的基于查询的规则


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

您可以编辑问题以包含尝试读取数据但失败的代码吗?您好,谢谢,我现在编辑了Q以更好地解释我试图实现的目标。您的
“sales”:{.read:“auth.token.admin==true”
将为具有
admin
声明且
true
的用户提供读取权限。如果此类用户在上运行您的代码
firebase.database().ref('sales')(“value”
,将允许读取。如果您拒绝此读取,则用户没有正确的权利。商店用户是否可以从/sales/?获取所有“他们的”记录的列表,而管理员可以读取
/sales
,其他用户无法从中读取。您可能希望Firebase自动筛选您需要的子节点有权访问,但不幸的是,情况并非如此。安全规则不会自动筛选数据(请参阅)。因此,虽然每个用户都可以访问其店铺的每个销售节点,但他们无法读取
/sales
以获取它们的列表。这可能有效,但我不确定
firebase.database().ref('sales') 
    .orderByChild('shop_id').equalTo(user.claims.shop_id) 
    .on('value' ...