Firebase的“规则不是过滤器”约束的解决方法

时间:2016-01-21 02:28:00

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

我想要一个安全规则,允许任何人获取用户列表并阅读他们的名字,但只允许登录用户查看自己的电子邮件。

以下是一个示例数据结构:

    "User" : {
        "abc123" : {
          "name" : "Bob",
          "email" : "bob@hotmail.com"
        }   
    }

安全规则的简单方法可能是执行以下操作:

"User" : {
    "$user" : {
        "name" : {
            ".read" : true
        },
        "email" : {
            ".read” : "auth.uid === $user"
        }
    }
}

但是,由于用户级别没有读取规则,因此将拒绝读取列表的请求。但是,在用户级别添加读取规则将覆盖电子邮件规则,并使每个子节点都可读(请参阅Firebase安全指南中的Rules Cascade)。

“安全指南”确实指出了Rules Are Not Filters,但没有就如何处理提供更多指导。

我应该将我的用户实体拆分为PrivateUser和PublicUser吗?

2 个答案:

答案 0 :(得分:1)

“解决方法”是使用Firestore(Firebase实时数据库有很多好处,但添加了更多的查询选项等)。

Firestore中没有“规则不是过滤器”限制!

但是,您必须以这种方式构造查询,以便只返回您具有读取权限的对象(否则会出现安全性异常)。

以下是一些起点文档:

安全规则: https://firebase.google.com/docs/firestore/reference/security/

查询:https://firebase.google.com/docs/firestore/query-data/queries

答案 1 :(得分:0)

让任何人获取用户列表并阅读他们的名字。并允许登录用户查看自己的电子邮件。

  

Zac说:首先考虑访问权限,然后对完全公开或完全私有的对象进行建模。

类型1:

{"rules":{
  "user_publicly":{"$user:{
    ".read":true,
    "name":{}
  }},
  "user_privately":{"$user:{
    ".read":"auth != null && $user == auth.uid",
    "email":{}
  }}
}}

类型2:

{"rules":{
  "user":{"$user:{
    "public":{
        ".read":true,
        "name":{}
    },
    "private":{
        ".read":"auth != null && $user == auth.uid",
        "email":{}
    }
  }}
}}