Firebase规则拒绝用户创建,可能有多个.read / .write规则?

时间:2016-11-02 23:46:00

标签: firebase-realtime-database firebase-security

过去两天我一直在努力解决Firebase项目的规则问题。我的数据结构如下:

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

           }
            pushToken{
            tokenid:mytokenid
           }
          }
         }

所以我的问题是,我无法在注册方面获得正确的规则。在注册过程中,我只是在Users中创建一个新的autoByID,但是如果我在Users中设置“.read”:true,那么每个人都可以在StripeInfo子项中看到secretpublishablekey和someothersecretinfo。我怎么能避免这个?我曾尝试设置“.read”:“auth === $ uid(在本例中为wildCardID)”,但由于Firebase规则的结构(据我所知),一旦授予了权限,它不能再被授予。我怎么解决这个问题?

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

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

如果我在用户中将.write设置为true,它只是为其他用户提供了编辑其他用户详细信息的权限,我真的想要阻止它,并尽快解决这个问题。有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

警告:我之前没有这样做,但我刚刚完成了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。或者简而言之,您可以查看此图片:

complex-validation

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

root-child-validation