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

Posted

技术标签:

【中文标题】Firebase 的“规则不是过滤器”约束的解决方法【英文标题】:Workaround for Firebase's "Rules Are Not Filters" constraint 【发布时间】:2016-04-27 03:27:44 【问题描述】:

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

这是一个示例数据结构:

    "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?

【问题讨论】:

这确实是一种常见的方法。通常,在 NoSQL 中对数据进行建模时,请根据您打算在应用程序中使用它的方式对数据进行建模。请参阅这篇文章以获得更多好的建议:highlyscalable.wordpress.com/2012/03/01/… 谢谢 Frank,我对 NoSQL 数据库没有任何经验。我幼稚的做法是,“好吧,我需要一个用户对象,而用户拥有这些属性,其中一些是私有的”。那么你是说更好的思考过程是首先考虑访问,然后对完全公共或完全私有的对象进行建模? 具有 SQL 背景的人尝试将他们的关系模型建模为分层系统(如 Firebase)是很常见的。它只是行不通。阅读这篇文章,你会更好地应对。还推荐在 Firebase 网站上阅读:firebase.com/blog/2013-04-12-denormalizing-is-normal.html、firebase.com/docs/web/guide/structuring-data.html。这似乎也不错:airpair.com/firebase/posts/structuring-your-firebase-data 和我们 Google 群组的最新帖子:groups.google.com/forum/#!topic/firebase-talk/1p4O4Pc2w6k 【参考方案1】:

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

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":
    
  

【讨论】:

我同意,尤其是在使用 NoSQL 规则建模时,始终尝试在您的结构中进行私有和公共访问,这可能比在用户节点之外的某处创建另一组重复数据集更有效再来一遍【参考方案2】:

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

Firestore 中没有“规则不是过滤器”的限制! 编辑: 感谢@DougStevenson 让我更具体。 在 Firestore 中,规则仍然不是过滤器,但与 Firebase Realtime DB 不同,它们与过滤兼容。

不过,您必须以这样一种方式构造查询,即只返回您拥有读取权限的对象(否则您会遇到安全异常)。

以下是一些起点文档:

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

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

【讨论】:

这不是真的。安全规则仍然不是 Firestore 中的过滤器。客户端必须根据规则的期望进行过滤。 firebase.google.com/docs/firestore/security/… @DougStevenson - 是的 - 它们不是过滤器,但它们与过滤器兼容。我正在添加一个编辑。谢谢。

以上是关于Firebase 的“规则不是过滤器”约束的解决方法的主要内容,如果未能解决你的问题,请参考以下文章

Optaplanner逐步学习 : 基本概念 - Optaplanner,规划问题, 约束,方

dobbo配置约束

分布式事务之最大努力通知型

iOS - 约束在 viewdidload 中以意想不到的方式动画?

使用 Firebase 实时数据库和 React 将图像上传给用户 [重复]

自动布局比例间距