【问题标题】:Firebase rules user creation denied, possible multiple .read/.write rule?Firebase 规则用户创建被拒绝,可能有多个 .read/.write 规则?
【发布时间】:2017-03-16 10:57:23
【问题描述】:

过去两天我一直在为我的 Firebase 项目的规则而苦苦挣扎。我的数据结构是这样的:

            Users{
            wildCardID{
            username:John
            gender:male
            StripeInfo{
accountID:myaccountid
secretpublishablekey:thekey
someothersecretinfo:secretinfo

           }
            pushToken{
            tokenid:mytokenid
           }
          }
         }

所以我的问题是,我无法在注册方面制定正确的规则。在注册期间,我只需在用户中创建一个新的 autoByID,但如果我在用户中设置“.read”:true,每个人都可以在 StripeInfo 子项中简单地看到 secretpublishablekey 和 someothersecretinfo。我将如何避免这种情况?我试图设置“.read”:“auth === $uid(在这种情况下,wildCardID)”,但由于Firebase规则的结构(据我所知),一旦授予权限,它不能再次被取消。我该如何解决我的这个问题?

我希望用户注册一个用户,我希望用户名是“.read”:true,因为您必须在注册期间检查用户名是否正在使用中。但是,要在我的应用程序中进行购买,用户需要在 StripeInfo 子项中检索其他用户的 accountID,因此将其设置为“.read”:“auth !== null”。但其余数据(secretpublishablekey 和 someothersecretinfo)将设置为“.read”:“auth.uid === $uid”。

当我尝试实现 .write 时也会出现此问题。我只是希望用户编辑他们自己的个人详细信息,或者如果有新的注册 - 我希望用户能够在用户中创建一个新的孩子。我该怎么做才不会搞砸?我现在已经搜索了很多地方,但没有得到任何信息。不可能吗?

如果我在 users 中将 .write 设置为 true,它只是授予其他用户编辑其他用户详细信息的权限,我真的想防止这种情况发生,并尽快解决这个问题。有人可以帮帮我吗?

【问题讨论】:

  • 有没有办法解决这个问题?

标签: firebase-realtime-database firebase-security


【解决方案1】:

警告:我以前没有这样做过,但我刚刚完成了对规则的video 的检查。

在用户结构下创建元数据,以便在该区域存储隐藏数据。如果您需要拆分一些元数据以供公共使用,只需更改该键或将公共数据放在 User 对象下并完全限制对元数据的读/写访问。

修改后的数据结构应该是这样的:

/Users/$uid (wildcard) / metadata / hiddenKeyForValue

然后在您的规则中创建如下内容:

{
"rules": {
    "Users": {
     "$uid": {
       "publicMetadata": {
              ".read" : "auth !== null",
              ".write" : "auth !== null" 
           }  
       "metadata" : {
              ".read" :  $uid === auth.uid ,
              ".write" : $uid === auth.uid 
       }
     } 
    }
  }
}

所以基本上,如果您将隐藏数据放在单个节点下,那么您可以编写一组规则来管理它。否则您必须编写更多规则。我发现guide 的这一部分与模拟器一起很有用。 securing data 部分包含有关服务器变量的详细信息以及更详细的示例。

有关使用验证的更多信息,它比写入/读取规则更具限制性,请参阅以下video。或者简而言之,您可以查看此图像:

您可以通过查看当前授权 uid 的注册用户列表,将规则应用于为注册用户(而不是匿名用户)预留的区域。

【讨论】:

  • Firebase 数据库规则级联,因此您在根目录中指定的 ".read": "auth != null", ".write": "auth != null" 规则为任何经过身份验证的用户提供对整个数据库的读写访问权限。一旦您向父母授予权限,您就不能在孩子身上撤销它。
  • 您(现已编辑)的评论提到了验证规则和 uid。需要记住的是,删除没有经过验证,因此基于 uid 的验证规则不会阻止删除。
  • @cartant ~ 是的。如警告中所述,我是 FB 的新手,但我会在我投入其中时将那张纸条藏起来..
猜你喜欢
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多